봄 콩의 컴팩트 모드 선택

효과

보통 개발에서, 우리는 종종, 당신은 클래스를 달성하기 위해 적절한 환경을 선택해야 더 하나 개의 인터페이스 구현 클래스보다 발생합니다.

가장 쉬운 방법은 같은 어떤 구현 클래스를 결정하는 경우 - 다른 인스턴스에 대한 선택을 작성하는 것입니다 :

if(条件1){
  return 实现类a的实例;
}else if(条件2){
  retuen 实现类b的实例;
}

다음 선택 코드가있는 경우 다른 추가 할 필요가도, 클래스를 추가 구현 그러나,이 방법은, 개폐합니다 (OCP)의 원칙을 준수하지 않습니다.

그래서, 온라인 일부 동료 및 코드에 대한 참조 후, 나는 함께 간단한 디자인 원칙의 일관성을 구현했습니다.

더 나은 선택이 될 것입니다 : 도구

이 전략은 상기 선택된 모드를 사용하여 스프링 자동 주입 특성을 이용한다.

우선, 우리는 네 가지 도구를 제공해야합니다 :

public interface MatchingBean<K> {
    boolean matching(K factor);
}
public interface MyFactoryList<E extends MatchingBean<K>, K> extends List<E> {
    E getBean(K factor);
    List<E> getBeanList(K factor);
}
public class MyFactoryArrayList<E extends MatchingBean<K>, K> extends ArrayList<E>
        implements MyFactoryList<E, K>, Serializable {
    @Override
    public E getBean(K factor) {
        Iterator<E> itr = iterator();
        while (itr.hasNext()) {
            E beanMatch = itr.next();
            if (beanMatch.matching(factor)) {
                return beanMatch;
            }
        }
        return null;
    }
    @Override
    public List<E> getBeanList(K factor) {
        Iterator<E> itr = iterator();
        while (itr.hasNext()) {
            E beanMatch = itr.next();
            if (!beanMatch.matching(factor)) {
                itr.remove();
            }
        }
        return this;
    }
}
public class MyFactoryListEditor extends CustomCollectionEditor {
    public MyFactoryListEditor() {
        super(MyFactoryArrayList.class);
    }
}

더 나은 선택 : 사용 예

우리는 인터페이스 쇼핑, Taobao의 및 Jingdong 두 가지 구현을 가정 해 봅시다.

MatchingBean 쇼핑 인터페이스 코드를 다음과 같이 구성되어 상속합니다 그래서 보자 :

public interface BuyService extends MatchingBean<String> {
    public String goShopping();
}

다음과 같이, 구현 클래스 구현 매칭 방법 :

@Service
public class JingdongService  implements BuyService {

    @Override
    public String goShopping() {
        return "Shopping in Jd";
    }

    @Override
    public boolean matching(String factor) {
        return "jd".equals(factor);
    }
}
@Service
public class TaobaoService implements BuyService {

    @Override
    public String goShopping() {
        return "Shopping in Taobao";
    }

    @Override
    public boolean matching(String factor) {
        return "taobao".equals(factor);
    }
}

마지막으로,의 사용에 테스트 클래스, 모양 선택기를 작성할 수 :

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestMyBeanUtil {

    @Autowired
    MyFactoryList<BuyService,String> factoryList;

    @Test
    public void testOne(){
        BuyService shop = factoryList.getBean("jd");
        System.out.println(shop.goShopping());
    }
}

참조

https://my.oschina.net/guanhe/blog/1821060

추천

출처www.cnblogs.com/bailiyi/p/12115027.html