最近看了《head first 設計模式》一書,便總結了裡面的一些內容,今天就簡單介紹一下策略模式。 策略模式:定義了演算法族,分別封裝起來,讓他們能夠相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。簡單來說,就是將各個演算法分別封裝起來,使得他們能夠互換。 下麵是策略模式的示例結構圖: 策略模式
最近看了《head first 設計模式》一書,便總結了裡面的一些內容,今天就簡單介紹一下策略模式。
策略模式:定義了演算法族,分別封裝起來,讓他們能夠相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。簡單來說,就是將各個演算法分別封裝起來,使得他們能夠互換。
下麵是策略模式的示例結構圖:
策略模式涉及三個角色:
- 環境類(context):用一個ConcreteStrategy對象來配置。持有Strategy的引用。
- 抽象策略類(Strategy):定義了所有演算法的公共介面。
- 具體策略類(ConcreteStrategy):定義了每一個演算法,每個演算法實現了同一個介面
源代碼:
抽象策略類:
public interface Strategy { /** * 策略方法 */ public void strategyInterface(); }
具體策略類:
public class ConcreteStrategyA implements Strategy { @Override public void strategyInterface() { //相關的業務 } }
public class ConcreteStrategyB implements Strategy { @Override public void strategyInterface() { //相關的業務 } }
對象類:
public class Context { //持有一個具體策略的對象 private Strategy strategy; /** * 構造函數,傳入一個具體策略對象 * @param strategy 具體策略對象 */ public Context(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */ public void contextInterface(){ strategy.strategyInterface(); } }
應用場景舉例:
抽象策略類:
/** * @author haifei * 抽象策略類 */ public interface FlyBehavior { public void fly(); }
具體策略類:
ConcreteStrategyA:
public class FlyNoWay implements FlyBehavior{ @Override public void fly() { System.out.print("不會飛行"); } }
ConcreteStrategyB:
public class FlyWithWings implements FlyBehavior{ @Override public void fly() { System.out.print("用翅膀飛行"); } }
環境類:
public class DuckSpecial { FlyBehavior flyBehavior; public DuckSpecial(FlyBehavior flyBehavior){ this.flyBehavior = flyBehavior; } public void fly(){ flyBehavior.fly(); } }
客戶端:
public class DuckSpecialTest { public static void main(String[] args) { //根據需要選擇演算法 FlyBehavior fly = new FlyWithWings(); DuckSpecial duck = new DuckSpecial(fly); duck.fly(); } }
運行結果:
用翅膀飛行