戦略モードを利用してコードを最適化するif else

2704 ワード

戦略モードを利用してコードを最適化するif else
今日はどのように戦略モードを利用して私達のコードの中のif elseを再構成するかと言います。高凝集低結合の設計理念に基づいて、ifelseのコードを剥離します。
/**
 *       
 * 
 * @author fengjie song
 *
 */
public interface IStrategyPattern {

	/**
	 * ifelse          
	 */
	void test();

	/**
	 *       
	 * 
	 * @return
	 */
	String support();
}
2、このインターフェースの様々な業務シーンを実現するには、ここで複数の実現類があります。ここで二つを挙げます。
シーン1:
@Service("strategyPatternImpl1")
public class StrategyPatternImpl1 implements IStrategyPattern {

	@Override
	public void test() {
		System.out.println("     1");
	}

	/**
	 *     , if        a   ,    1
	 * 
	 * @return
	 */
	public String support() {
		return "a";
	}
}
シーン2:
@Service("strategyPatternImpl2")
public class StrategyPatternImpl2 implements IStrategyPattern {

	@Override
	public void test() {
		System.out.println("     2");
	}

	/**
	 *     , if        a   ,    2
	 * 
	 * @return
	 */
	public String support() {
		return "b";
	}
}
3、呼び出し側ではどのポリシーを呼び出すべきかよく分かりませんので、通常の書き方はifelseで判断して、異なる方法を呼び出します。例えば、if(a).equals(type){…}ここではポリシーセレクタを使って最適化することを提案します。
/**
 *      
 * 
 * @author fengjie song
 *
 */
@Component
public class StrategyChoose implements ApplicationContextAware {

	private ApplicationContext context;

	private Map chooseMap = new HashMap(5);

	/**
	 *     
	 * 
	 * @param type
	 * @return
	 */
	public IStrategyPattern choose(String type) {
		return chooseMap.get(type);
	}

	/**
	 *         ,                 chooseMap   
	 * 
	 * @PostConstruct :                   
	 */
	@PostConstruct
	public void register() {
		//       spring             
		Map map = context.getBeansOfType(IStrategyPattern.class);

		for (IStrategyPattern strategy : map.values()) {
			
			String type = strategy.support();
			chooseMap.put(type, strategy);
		}
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.context = applicationContext;

	}

}
4、これで私達は直接戦略モードを呼び出すことができます。
@RunWith(SpringRunner.class)
@SpringBootTest
public class StrategyTest {

	@Autowired
	private StrategyChoose strategyChoose;

	public void test(String type) {
	    //          type         
		strategyChoose.choose(type).test();
       //         
       if ("a".equals(type)) {
			//     1
		}
		if ("b".equals(type)) {
			//     2
		}
	}
}
注:皆さんはその書き方がもっといいと思います。もちろん、過度な設計を避けるために、ifelseは読みやすくなることがあります。ifelseの中に複雑な業務ロジックがある時はこの方法を使って最適化することを勧めます。賦価値のために列挙を利用して最適化してもいいです。あるいはswitch文です。