一:策略模式的定義
策略模式是對演算法的包裝,把使用演算法的責任和演算法本身分隔開,委派給不同的物件管理。策略模式通常把一系列的演算法包裝到一系列的策略類別裡面,當作一個抽象策略類別的子類別。
其類別圖如下:
如果是要用JAVA類別來實現的策略模式,其原始程式碼如下:
Java程式碼
rrrereeeJava碼
rrrereee:
Java程式碼/** * * 策略执行 * @author weique.lqf * @version $Id: Context.java, v 0.1 2014-2-9 下午2:32:56 weique.lqf Exp $ */ public class Context { private Strategy stg; public Context(Strategy theStg) { this.stg = theStg; } public void doAction() { this.stg.testStrategy(); } }
實作類別二:
Java程式碼Java代码 /** * * * @author weique.lqf * @version $Id: Strategy.java, v 0.1 2014-2-9 下午2:32:17 weique.lqf Exp $ */ public interface Strategy { void testStrategy(); }
現在使用spring的系統可以說是多如牛毛,那麼如何在spring模式下實現策略呢?
其實只需要稍微改造下就可以了,因為spring的核心之一就是IOC。
先修改Contex類別:
Java程式碼
package com.proxy.strategy.impl; import com.proxy.strategy.Strategy; public class PrintStrategy implements Strategy { public void testStrategy() { System.out.print("我要打印!!"); } }
然後在spring設定檔裡面配置,
Xml :Java程式碼
package com.proxy.strategy.impl; import com.proxy.strategy.Strategy; public class WriteStrategy implements Strategy { public void testStrategy() { System.out.println("我要写字!!!"); } }看,這樣就將spring引入了。
但是這樣有好處也有壞處,如果我要根據不同的類型,比如說:合約是需要列印的,而情書是需要手寫的。假設合約為類型2,情書為類型1,那我們怎麼來自動適配?
三:進階版的spring策略模式
首先要修改Context類別:
Java程式碼
package com.proxy.strategy; import com.proxy.strategy.impl.PrintStrategy; public class StrategyClient { public static void main(String[] args) { Strategy stgA = new PrintStrategy(); Context ct = new Context(stgA); ct.doAction(); } }為:
Java程式碼
package com.proxy.strategy; public class ContextSpring { private Strategy stg; /** * Setter method for property <tt>stg</tt>. * * @param stg value to be assigned to property stg */ public void setStg(Strategy stg) { this.stg = stg; } public void doAction() { this.stg.testStrategy(); } }
然後運作下,看看會有什麼結果?