設計模式-策略模式(strategy pattern)

SeeMoonUp發表於2017-03-25

需求描述:

  1. 鴨子類(duck)
  2. 多個品種的鴨子(紅頭鴨,綠毛鴨,玩具鴨)
  3. 多種行為動作(呱呱叫,飛翔,外觀展示)

如何設計呢?

普通的設計模式:

  1. duck為父類,定義了呱呱叫 飛翔 外觀展示等方法
    public class Duck {
     public String guagua(){
         //呱呱叫
     }
     public String fly(){
         //飛翔
     }
     public String display(){
         //外觀展示
     }
    }複製程式碼
  2. 多個品種的鴨子 設計為子類 繼承 duck
    public class RedHeadDuck extend Duck{
     //覆寫父類的外觀方法
     public String display(){
         //我是紅頭鴨
     }
    }複製程式碼

這麼設計問題出現了,所有的鴨子都具有了飛翔和呱呱叫的能力,但是玩具鴨並不具有飛翔的能力

修改設計:

  1. duck仍為父類
    public class Duck {
     public String guagua(){
         //呱呱叫
     }
     public String display(){
         //外觀展示
     }
    }複製程式碼
  2. 設計介面 flyBehavior
    public interface FlyBehavior {
     Stirng fly();
    }
    public class FlyDuck extend Duck implements FlyBehavior {
     public String fly(){
         //我會飛翔
     }
    }
    public class ToyDuck extend Duck {
     public String display() {
         //我是一個玩具鴨
     }
    }複製程式碼
    將需要實現飛翔的子類實現介面flyBehavior
    這樣只需要玩具鴨不去實現介面就解決了飛翔的問題

但是 問題來了 如果說飛翔又分為 借力飛翔 迎風飛翔 等不同的飛翔方式
實現介面的子類需要 不同的實現方式,程式碼更多 而且不能夠複用

升級設計

  1. duck為父類
  2. 設計介面 flyBehavior
  3. 設計行為類 實現 flyBehavior
  4. duck 中引用 行為類
    public class Duck {
     private FlyBehavior flyBehavior;
     public setFlyBehavior(FlyBehavior f){
         this.flyBehavior = f;
     }
     public String fly(){
         return flyBehavior.fly();
     }
    }
    public class NoFly implements FlyBehavior {
     public String fly () {
         //不能飛翔
     }
    }
    public class CanFly implements FlyBehavior {
     public String fly () {
         //可以飛翔
     }
    }
    //還可以定義多種飛翔方式。。。。複製程式碼
    這樣設計就可以很靈活的修改類

結語:策略模式(strategy pattern)
將行為類 即易改變的東西抽取出來
多用組合 少用繼承
針對介面程式設計 不要針對實現程式設計
原文地址文章參考《head first 設計模式》
未經作者允許 請勿轉載,謝謝 :)

相關文章