二、策略模式
阿新 • • 發佈:2017-09-25
java 結合 clas 自己 xtend concrete 維護 @override bstr
1 策略模式實際上就是應對有各種策略(實現方法)的需求。比如超市促銷,有多種多樣的促銷策略,這時候就要想到策略模式,策略模式一般會配合工廠模式使用。
代碼如下:
package com.biao.strategy.original; /** * * @author biao * 策略模式:定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化,不會影響到使用 * 算法的客戶。 * * 應用:商場各種促銷方案。 * * 記憶方法:一個超類的算法家族+一個context容器。容器內通過構造方法註入一個超類的引用,容器內寫一個方法,實現註入的對象去調用具體的算法。*/ public class StrategyDemo { public static void main(String[] args) { //缺點:此處為邏輯部分,邏輯應該和界面分離,這裏相當於判斷多種方法,應該放到邏輯處理中,綜合簡單工廠模式, //將判斷創建哪一種對象的邏輯放入具體類中處理。 Context contextA = new Context(new ConcreteStrategyA()); Context contextB = new Context(new ConcreteStrategyB()); contextA.contextInterface(); contextB.contextInterface(); } }//抽象算法類,算法接口用於不同的實現方式 abstract class Strategy{ abstract public void AlgorithmInterface(); } //具體算法1 class ConcreteStrategyA extends Strategy{ @Override public void AlgorithmInterface() { // TODO Auto-generated method stub System.out.println("算法一的實現方案"); } } //具體算法2 classConcreteStrategyB extends Strategy{ @Override public void AlgorithmInterface() { // TODO Auto-generated method stub System.out.println("算法二的實現方案"); } } //Context類,用來維護一個Strategy,然後調用該具體類的算法。其實就是通過構造方法註入。 class Context{ Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public void contextInterface(){ strategy.AlgorithmInterface(); } }
如上demo中,主函數中創建容器(Context)的時候,需要用戶自己註入不同的對象,實際相當於用戶去判斷傳入什麽對象,這個判斷邏輯通過工廠的方法生成。(實際並沒變化,容器中任然維護一個策略超類的引用)代碼如下:
package com.biao.strategy.simplefactory; /** * * @author biao * 工廠模式和策略模式的簡單結合。策略模式用於封裝一些算法,供客戶端調用。 * 但是具體創建哪一個策略,是邏輯判斷部分,利用工廠模式的多態,生成不同算法的 * 對象,然後調用該對象的算法。 */ public class StrategyFactoryDemo { public static void main(String[] args) { Context contextA = new Context("模式A"); Context contextB = new Context("模式B"); contextA.contextInterface(); contextB.contextInterface(); } } //抽象算法類,算法接口用於不同的實現方式 abstract class Strategy{ abstract public void AlgorithmInterface(); } //具體算法1 class ConcreteStrategyA extends Strategy{ @Override public void AlgorithmInterface() { // TODO Auto-generated method stub System.out.println("算法一的實現方案"); } } //具體算法2 class ConcreteStrategyB extends Strategy{ @Override public void AlgorithmInterface() { // TODO Auto-generated method stub System.out.println("算法二的實現方案"); } } //Context類,用來維護一個Strategy,然後調用該具體類的算法。 class Context{ Strategy strategy; public Context(String flag){ switch(flag){ case "模式A": strategy = new ConcreteStrategyA(); break; case "模式B": strategy = new ConcreteStrategyB(); break; } } public void contextInterface(){ strategy.AlgorithmInterface(); } }
二、策略模式