iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
自我挑戰組

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

[深入淺出設計模式] Ch6 The Command Pattern (2) - 【命令模式】範例 Home Automation Remote Control

  • 分享至 

  • xImage
  •  

範例 Home Automation Remote Control 家電智能遙控

還記得我們在觀察者模式的時候,書中讓我們接了一個寫天氣監測系統的「案子」,當時的甲方可以說是十分滿意,所以有另一個老闆慕名而來,拜託我們完成這個家電智能遙控的API。
老樣子,大老闆有些要求:

  1. 遙控器有七個功能區塊,每個區塊對應一個功能(家電)或是一組自訂的裝置。
  2. 第七個區塊要是一個「取消」,可以取消目前的所有動作,可以理解成一個 global 的變數。
  3. 這個API要能讓人設定要對應的功能,所以程式要是可以擴充又有彈性的。 如果可以寫死的話,我就可以在第21天停更,設計模式後面章節都作廢⋯⋯
  4. 需要用到的類別都在CD裡
    https://ithelp.ithome.com.tw/upload/images/20231006/20163178SvCEJcSiwH.png

可以看到,每個類別因為是不同裝置,所以都是不一樣的方法,如果我們另外寫一個 Request() 類別,每次請求按下按鈕就執行對應功能,可能會變成⋯⋯

public class Request{
    public TV tv;
    public Light light;
    public GarageDoor westDoor;

    public void pressBtn(int btnVal){
        if(btnVal == 1){
            tv.on();
        }
        else if(btnVal == 2){
            light.off();
        }
        else if(btnVal == 3){
            light.on();
        }
        else{
            // 隨著連接裝置跟功能數量無限增生下去⋯⋯            
        }
    }
}

所以理想的方式是使用命令模式,讓request還有家電功能的method分開,下一篇繼續把它完成 →


參考資料:

  1. 《深入淺出設計模式 (Head First Design Patterns) 》
  2. 書中官方程式碼傳送門

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


上一篇
[深入淺出設計模式] Ch6 The Command Pattern (1) - 【命令模式】概念講解
下一篇
[深入淺出設計模式] Ch6 The Command Pattern (3) - 【命令模式】範例實作 範例 Home Automation Remote Control
系列文
深入淺出設計模式 (Head First Design Pattern) - 重點整理及範例分享35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言