站長留言

  • ✅ 本站維護及更新歷史紀錄,詳情請參考公告
  • ✅ 有任何意見、想法,歡迎留言給Spicy知道喔
  • ✅ 固定於每周一至周五更新Blogger文章,周末不定期
程式Design PatternJava

【Design Pattern】6:Command Pattern 命令模式 (行為)

上一篇:Singleton Pattern 單例模式、獨體模式 (創造)
tags: Design Pattern

Introduction 簡介

  1. 將 請求/命令 封裝成物件
  2. 高內聚、低耦合:發出請求的物件 和 執行請求的物件 鬆綁(loose-coupling)
  3. 分離 UI 和 商業邏輯 的設計模式
  4. 支援 undo復原
  5. open/close:把請求個別封裝,就不用一直修改舊的程式碼


Command Pattern 命令模式

角色

  1. Client:負責建立 Concrete Command,並設定 Receiver
    • 這裡的 Client 並不代表客戶
  2. Invoker:負責儲存與呼叫 Concrete Command
    • The invoker decides when the method should be called. 調度命令
    • 若有 undo 方法,會先在這裡儲存 undo 狀態
  3. Receiver:負責執行 Concrete Command
    • The receiver is an instance of the class that contains the method’s code. 執行命令
  4. Command:Interface 或 abstract class
    • 至少包含一個 execute 方法
    • undo()
  5. 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 延伸概念

  1. 巨集 Command:
    • Concrete Command的建構子,改為 Command[]
    • 並execute每一個command
    • 直接在 Client 使用此 Concrete Command
  2. 多次undo (歷史紀錄)
  3. 佇列 Queue
  4. 日誌 Log
  5. Example
    • 資料庫交易系統、裝置控制、遊戲、管理系統

Example 例子

  1. 遙控器 + 電燈開關

  2. 遙控器 + 花園電燈開關、灑水器開關

  3. 服務生 + 點餐

Code 程式碼範例


Extensive Reading 延伸閱讀

  1. 命令模式 (Command Pattern):https://notfalse.net/4/command-pattern
  2. 詳細說明:https://quanke.gitbooks.io/design-pattern-java/请求发送者与接收者解耦——命令模式(二).html

Reference 參考資料

  1. 圖片:https://www.c-sharpcorner.com/UploadFile/b7dc95/command-design-pattern-demystified/
  2. RiCo技術農場:https://dotblogs.com.tw/ricochen/2012/08/03/73801
  3. 技術筆記:http://twmht.github.io/blog/posts/design-pattern/command.html

沒有留言:

張貼留言

本網站建議使用電腦或平板瀏覽