一、是什么?作用?
策略模式的思想是定義一些算法族,分別封裝起來,讓他們可以相互替換,此模式讓算法的變化獨立於使用算法的客戶
策略模式的適用場景:
- 當一個系統中有許多類,它們之間的區別僅在於它們的行為,希望動態地讓一個對象在許多行為中選擇一種行為時;
- 當一個系統需要動態地在幾種算法中選擇一種時;
- 當一個對象有很多的行為,不想使用多重的條件選擇語句來選擇使用哪個行為時。
二、使用實例
場景:鴨子分為綠頭鴨和模型鴨子,以后還能有其他鴨子,綠頭鴨可以呱呱叫,也可以用翅膀飛,模型鴨子可以呱呱叫,但是不能飛
1. 定義飛的接口行為
/** * 飛的接口類 */ public interface FlyBehavior { void fly(); } // ============================ /** * 用翅膀飛 - 實現類 */ public class FlyWithWings implements FlyBehavior { @Override public void fly() { System.out.println("I'm flying"); } } // ========================= /** * 不會飛 - 實現類 */ public class FlyNoWay implements FlyBehavior { @Override public void fly() { System.out.println("I can't fly"); } }
2. 定義叫的接口行為
/** * 叫的接口類 */ public interface QuackBehavior { void quack(); } // ======================= /** * 咕咕叫 */ public class MuteQuack implements QuackBehavior { @Override public void quack() { System.out.println("咕咕叫"); } } // ======================= /** * 嘎嘎叫 */ public class Squeak implements QuackBehavior { @Override public void quack() { System.out.println("嘎嘎叫"); } }
3. 編寫鴨子類, 注意這里有的是組合
/** * 鴨子類 基類, 注: 這里可以寫給set行為的方法,方便動態設置行為 */ public abstract class Duck { private FlyBehavior flyBehavior; private QuackBehavior quackBehavior; public Duck() { } // 執行飛的動作 public void performFly() { flyBehavior.fly(); } // 執行叫的動作 public void performQuack() { quackBehavior.quack(); } } /** * 綠頭野鴨類 注意點: 就在鴨子的行為在這個時候賦值給鴨子, 想換別的行為隨便換 */ public class MallardDuck extends Duck{ public MallardDuck() { this.flyBehavior = new FlyWithWings(); this.quackBehavior = new MuteQuack(); } }
4. 測試
/** * 小鴨子測試類 */ public class MiniDuckSimulator { public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.performFly(); mallard.performQuack(); } }
三、總結
1.如果是以前我很可能有鴨子抽象類來定義飛的行為,子類重寫飛的行為,當忽然添加另外一種鴨子,它有特殊的行飛的行為(帶火箭噴射器的翅膀),這時候又得重寫這個行為,不管什么鴨子,我都得重寫他的飛的行為;
2. 如果用了策略模式,只需要要編寫這個特殊飛的行為,然后在這只鴨身上賦上這種行為就行了,其他已經編寫的代碼一點都沒有收到影響,牛批