利用策略模式優化代碼的if else

利用策略模式優化代碼的if else

今天我們來說說如何利用策略模式重構我們代碼中的if else
1、我們本着高內聚低耦合的設計理念,將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<String, IStrategyPattern> chooseMap = new HashMap<String, IStrategyPattern>(5);

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

	/**
	 * 用來在服務啓動時,講策略的實現類初始化進我們事先準備chooseMap容器中
	 * 
	 * @PostConstruct :該註解的方法只會在服務啓動時被加載一次
	 */
	@PostConstruct
	public void register() {
		// 這裏我們利用spring的上下文獲取策略接口的實現
		Map<String, IStrategyPattern> 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語句

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章