iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
自我挑戰組

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

[深入淺出設計模式] Ch6 The Command Pattern (1) - 【命令模式】概念講解

  • 分享至 

  • xImage
  •  

命令模式 The Command Pattern

主要概念是將請求或操作封裝成對象,以便在不同的情境下執行這些請求,同時使得我們能夠解耦發出請求的對象和實際執行請求的對象:

  1. 命令對象(Command Object):在Command模式中,命令被表示為一個對象,它包含了執行特定操作所需的所有信息,包括操作的接收者(實際執行操作的對象)、操作的方法等。這種對象將請求的發送者和接收者解耦,使得我們可以輕鬆地對請求進行擴展和修改。

  2. 接收者(Receiver):接收者是實際執行操作的對象,命令對象將操作委託給接收者來執行。這種方式使我們可以更換不同的接收者,從而實現不同的操作,同時不影響請求的發送者。

  3. 調用者(Invoker):就像一個控制器,知道如何觸發不同命令的執行,而且不需要了解命令的細節,只需知道每個命令的名稱,然後按下按鈕,就像你按遙控器上的按鈕一樣。

  4. 客戶端(Client):客戶端是使用Command模式時的程式碼,它負責創建命令對象和設置其接收者。客戶端通常是請求的發送者。

  5. 取消(Undo):Command模式的額外好處是它可以撤銷操作。因為命令對象將操作封裝起來,所以可以輕鬆實現操作的撤銷功能,只要保留相關的命令對象紀錄。

  6. 宏命令(Macro Command):宏命令是一種特殊的命令,它可以包含多個子命令,當執行宏命令時,會連續執行所有子命令,如果需要處理大量資訊的話很實用。


舉個例子,把它想像成遙控器和家電設備之間的互動:

  • 遙控器:這是命令的發送者(Invoker),它有一系列按鈕,每個按鈕代表一個命令。

  • 按鈕:每個按鈕代表一個命令(例如,開燈、關燈、打開音響、關閉音響)。按下按鈕就像發送了一個命令。

  • 命令對象:每個命令都是一個獨立的對象,它知道如何執行特定的操作(例如,開燈、關燈、打開音響、關閉音響)。

  • 家電設備:家電設備是命令的接收者(Receiver),它實際執行命令所需的操作(例如,控制燈泡或音響的狀態)。

當你按下遙控器上的按鈕時,遙控器會創建相應的命令對象,並用命令對象來執行操作,而不需要知道操作的細節。這樣,遙控器和家電設備之間的關係就可以解耦,同時也實現了操作的撤銷和批處理等功能,卻不影響現有的程式碼。

總之,Command模式的主要目標是實現請求的發送者和接收者之間的解耦,同時提供了操作的撤銷和批處理等額外功能。通過將請求封裝成對象,我們可以更靈活地設計和擴展系統,同時保持程式的可維護性,讓可讀性更高。


參考資料:

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

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


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

尚未有邦友留言

立即登入留言