java策略模式與Spring整合
阿新 • • 發佈:2018-12-31
java設計模式有很多種,其中策略模式算是比較常用的。在專案寫完之後對部分程式碼進行了重構,其中就用到了策略模式(strategy),有了一點體會就記錄一點點
需求:根據不同的渠道程式碼自動生成流水號,
需求很簡單,我們常用的if else if …..else就能夠把需求解決,但這樣程式拓展效能不好,每新增一條就要修改不少的if else的原始碼,所以這裡就使用了策略模式。
第一步:先看策略介面
/**
* 運用策略模式來自動生成袋號
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2017</p>
* @author ll
* @version V1.0
*/
public interface BoardNoService {
/**
* 根據不用的渠道程式碼生成不同的袋號,如果渠道程式碼為空,則按照coe指定的預設生成規則生成袋號
* 暫時只支援"ETRR"和"ETRN"兩種渠道
* @param channelCode:渠道程式碼
* @return
*/
public String produceBoardNo(String channelCode);
}
第二步:看策略介面的具體實現:在這裡具體實現方法和業務邏輯就不貼上來了,不是重點。
第三步:建立一個策略持有類
public class BoardNoContext {
private Map<String, BoardNoService> mapStractegy = new HashMap<String, BoardNoService>();
public Map<String, BoardNoService> getMapStractegy() {
return mapStractegy;
}
public void setMapStractegy(Map<String, BoardNoService> mapStractegy) {
this .mapStractegy = mapStractegy;
}
public String getNewBoardNo(String channelCode){
return this.mapStractegy.get(channelCode).produceBoardNo(channelCode);
}
}
這個策略持有類有個成員屬性map,map的key就是對應的渠道程式碼,map對應的value就是策略介面;
這個類中的getNewBoardNo()方法就是map中取出第一步中的策略介面的具體實現類,並呼叫該類的produceBoardNo()方法生成一個流水號,然後返回。
使用的時候先注入:
再呼叫其方法:
然後再看看在applicationContext.xml中的配置:
<!-- 使用策略模式根據不同的渠道,按指定規則生成袋號 該bean是策略持有類 -->
<bean id="bc" class="com.coe.exp.service.board.BoardNoContext">
<!-- mapStractegy是一個map,key是渠道程式碼,value是策略介面的實現-->
<property name="mapStractegy">
<map>
<entry key="ETRN" value-ref="etrn"></entry>
<entry key="ETRR" value-ref="etrr"></entry>
<entry key="COE" value-ref="coe"></entry>
</map>
</property>
</bean>
<bean id="etrn" class="com.coe.exp.service.board.impl.ETRNBoardNoServiceImpl"></bean>
<bean id="etrr" class="com.coe.exp.service.board.impl.ETRRBoardNoServiceImpl"></bean>
<bean id="coe" class="com.coe.exp.service.board.impl.COEBoardNoServiceImpl"></bean>
直接debug一次,看結果
以上就是策略模式在專案中的實際應用,希望能幫助讀者