iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
自我挑戰組

深入淺出設計模式 (Head First Design Pattern) - 重點整理及範例分享系列 第 3

[深入淺出設計模式] Ch1 Intro to Design Patterns (3) - 【策略模式 Strategy Pattern】 SimUDuck 鴨子模擬器 &範例補充

  • 分享至 

  • xImage
  •  

上一篇文章中大家應該有發現,在鴨子的類別中有包含兩個方法,分別是setQuackBehavior()setFlyBehavior()

abstract class Duck{
        public FlyBehavior $flyBehavior;
        public QuackBehavior $quackBehavior;
        
        function __construct(){}        
        abstract public function display();
        
        function setFlyBehavior(FlyBehavior $flyAction){
            $this -> flyBehavior = $flyAction;
        }
        
        function setQuackBehavior(QuackBehavior $quackAction){
            $this -> quackBehavior = $quackAction;
        }
    
        function performFly(){
            $this -> flyBehavior -> fly();
        }
    
        function performQuack(){
            $this -> quackBehavior -> quack();
        }
    
        function swim(){
            echo "All duck float!";
        }           
    }

因為在我們會先在建構子去定義這隻鴨子的飛行跟叫聲,考量到之後可能需要更改他們這些行為,用一個比較dynamic的方法去做,這樣也不必真的去修改到該鴨子類別的建構子,更改DuckSimulator.php如下:

    header('Content-type: text/plain');
    include "./Class/Duck.php";
    
    $mallard = new MallardDuck();
    $mallard -> display();
    echo "fly behavior before setting: ";
    $mallard -> performFly();
    $mallard -> setFlyBehavior(new FlyRocketPowered);
    echo "fly behavior after setting: ";
    $mallard -> performFly();

從output可以看到鴨子飛行的差異:
https://ithelp.ithome.com.tw/upload/images/20230918/20163178WY7bvs7SyA.png

書中有留給大家另一個範例,我把程式碼放在github,有興趣的話可以看看喔


重點概念:

  • 多多把物件之間複合,不要想著繼承 (Favor composition over inheiritance):
    這個精神會貫穿這本書,而且被運用在很多種設計模式中,不過在不同的設計模式中也會有各自的缺點。

  • 策略模式

    • 利用介面封裝類別的共同行為,並用介面與類別去實作共同行為的內容,而不是去改程式碼
    • 封裝時可以達到所謂可替換性(interchangeable),例如子類別的不同鴨子可以透過同一個方法-performFly() 呼叫飛行,而飛行介面透過不同類別去實作不同內容。

觀念補充:

  • 複合 composition:
    • 將不同物件結合在一起,通常可以比繼承獲得更多彈性
    • 兩個物件的複合關係也被稱為 「HAS_A
      例如:
      Duck HAS_A FlyBehavior
      Duck HAS_A QuackBehavior

參考資料:

  1. 《深入淺出設計模式 (Head First Design Patterns) 》

  2. 物件導向程式設計:為何說composition優於inheritance?
    https://tw.twincl.com/programming/*662v

  3. 策略模式
    https://www.runoob.com/design-pattern/strategy-pattern.html

此篇跟上篇的完整程式碼

https://github.com/changtintin/Design-Pattern/tree/7f1a90c143945f3e6634e98fad92885a947664c5/Ch1/Duck


Disclaimer
因為讀的是原文版,所以難免會有翻譯詞不達意或是專有名詞上的差異,有錯誤的話歡迎在留言區一起交流!


上一篇
[深入淺出設計模式] Ch1 Intro to Design Patterns (2) SimUDuck 鴨子模擬器
下一篇
[深入淺出設計模式] Ch2 The Observer Pattern (1) - 【觀察者模式】
系列文
深入淺出設計模式 (Head First Design Pattern) - 重點整理及範例分享35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言