효과
보통 개발에서, 우리는 종종, 당신은 클래스를 달성하기 위해 적절한 환경을 선택해야 더 하나 개의 인터페이스 구현 클래스보다 발생합니다.
가장 쉬운 방법은 같은 어떤 구현 클래스를 결정하는 경우 - 다른 인스턴스에 대한 선택을 작성하는 것입니다 :
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