tags: Design Pattern
Introduction 簡介
- 將 請求/命令 封裝成物件
- 高內聚、低耦合:發出請求的物件 和 執行請求的物件 鬆綁(loose-coupling)
- 分離 UI 和 商業邏輯 的設計模式
- 支援 undo復原
- open/close:把請求個別封裝,就不用一直修改舊的程式碼
Command Pattern 命令模式
角色
- Client:負責建立 Concrete Command,並設定 Receiver
- 這裡的 Client 並不代表客戶
- Invoker:負責儲存與呼叫 Concrete Command
- The invoker decides when the method should be called. 調度命令
- 若有 undo 方法,會先在這裡儲存 undo 狀態
- Receiver:負責執行 Concrete Command
- The receiver is an instance of the class that contains the method’s code. 執行命令
- Command:Interface 或 abstract class
- 至少包含一個 execute 方法
- undo()
- Concrete Command:負責呼叫 Receiver 的對應操作
- 實作 Command
- 有 Receiver 的物件
- 在execute方法中撰寫呼叫物件 Receiver 的程式碼
No Command
- NoCommand 物件:處理 null 的責任給 NoCommand
- 使用時機:Receiver 未知,可能有 null 時
- 繼承 or 實作 Command
- 用於 Invoker,處理方法可能會出現 null object 的情況
Disadvantage 缺點
- 可能會有過多的 Concrete Command
Comparison 比較
模式 | 說明 |
---|---|
Command Pattern | 將 “行爲” 進行封裝 |
Factory Method Pattern | 將 “創建” 進行封裝 |
Extensive Concepts 延伸概念
- 巨集 Command:
- Concrete Command的建構子,改為 Command[]
- 並execute每一個command
- 直接在 Client 使用此 Concrete Command
- 多次undo (歷史紀錄)
- 佇列 Queue
- 日誌 Log
- Example
- 資料庫交易系統、裝置控制、遊戲、管理系統
Example 例子
-
遙控器 + 電燈開關
-
遙控器 + 花園電燈開關、灑水器開關
-
服務生 + 點餐
Code 程式碼範例
Extensive Reading 延伸閱讀
- 命令模式 (Command Pattern):https://notfalse.net/4/command-pattern
- 詳細說明:https://quanke.gitbooks.io/design-pattern-java/请求发送者与接收者解耦——命令模式(二).html
沒有留言:
張貼留言