1. 程式人生 > >《Head First 設計模式》:策略模式

《Head First 設計模式》:策略模式

# 正文 ## 一、定義 策略模式定義了演算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。 **要點:** * 策略模式把系統中會變化的部分抽出來封裝。 ## 二、實現步驟 ### 1、建立策略介面 ``` /** * 策略介面 */ public interface Strategy { /** * 執行策略行為 */ public void perform(); } ``` ### 2、建立策略介面的實現類 #### (1)策略實現類 A ``` /** * 策略實現類A */ public class StrategyImplA implements Strategy { /** * A策略行為 */ @Override public void perform() { System.out.println("perform A..."); } } ``` #### (2)策略實現類 B ``` /** * 策略實現類B */ public class StrategyImplB implements Strategy { /** * B策略行為 */ @Override public void perform() { System.out.println("perform B..."); } } ``` ### 3、在使用策略的類中,宣告並使用介面型別的策略變數 ``` /** * 策略使用者 */ public class StrategyUser { /** * 宣告介面型別的策略變數 */ private Strategy strategy; /** * 通過構造例項化策略 */ public StrategyUser(Strategy strategy) { this.strategy = strategy; } /** * 執行策略使用者的行為 */ public void doBehavior() { // do something... // 使用策略 strategy.perform(); // do something... } } ``` ### 4、通過例項化不同的策略實現類,來改變使用者的行為 ``` public class Test { public static void main(String[] args) { // 使用策略A StrategyUser userA = new StrategyUser(new StrategyImplA()); userA.doBehavior(); // 使用策略B StrategyUser userB = new StrategyUser(new StrategyImplB()); userB.doBehavior(); } } ``` ## 三、舉個栗子 ### 1、背景 Joe 上班的公司做了一套相當成功的模擬鴨子游戲:SimUDuck。遊戲中會出現各種鴨子,鴨子的種類及屬性如下: * 種類:綠頭鴨、紅頭鴨、橡皮鴨、誘餌鴨。 * 屬性:外觀、游泳行為、飛行行為、呱呱叫行為(叫聲)。 不同種類的鴨子所對應的屬性如下: * 綠頭鴨:綠頭鴨的外觀、會游泳、會飛行、呱呱叫。 * 紅頭鴨:紅頭鴨的外觀、會游泳、會飛行、呱呱叫。 * 橡皮鴨:橡皮鴨的外觀、會游泳(漂浮)、不會飛行、吱吱叫。 * 誘餌鴨:誘餌鴨的外觀、會游泳(漂浮)、不會飛行、不會叫。 ### 2、要點 * 由於不同種類的鴨子可能具有不同的飛行行為、呱呱叫行為,因此,可以使用策略模式把這兩種行為抽出來。 ### 3、實現 #### (1)建立行為介面 ``` /** * 飛行行為介面 */ public interface FlyBehavior { public void fly(); } ``` ``` /** * 呱呱叫行為介面 */ public interface QuackBehavior { public void quark(); } ``` #### (2)實現行為介面 ``` /** * 用翅膀飛行 */ 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 flying!"); } } ``` ``` /** * 呱呱叫 */ public class Quack implements QuackBehavior { @Override public void quark() { System.out.println("Quack"); } } /** * 吱吱叫 */ public class Squeak implements QuackBehavior { @Override public void quark() { System.out.println("Squeak"); } } /** * 不會叫 */ public class MuteQuack implements QuackBehavior { @Override public void quark() { System.out.print