iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
自我挑戰組

Design Pattern - 無所不在的設計模式系列 第 20

[Day20] Design Pattern - Command命令模式

  • 分享至 

  • xImage
  •  

前言

今天吃中飯時有個有趣的對話...
主管說會不會哪天看著以前自己寫的code發現: 哇當初怎麼寫出那麼乾淨的code!!
師父想了想回說:我好像沒遇過這種狀況,反而是看到一段寫的很爛的code想說是誰寫的,翻了紀錄後發現是幾年前自己寫的...😑
(下班後回想時)
看似平常的對話卻發現如果像師父那樣是有在進步的證明!!

定義


Command is a behavioral design pattern that turns a request into a stand-alone object that contains all information about the request. This transformation lets you pass requests as a method arguments, delay or queue a request’s execution, and support undoable operations.
--Refactoring Guru

命令模式是一種行為型模式,它可以將一個請求轉換成一個擁有包含請求資訊的獨立物件。這種轉換使你能夠將請求作為方法引數傳遞,延遲或佇列請求的執行,並實現可撤銷的操作。

舉個例子吧~


假設經營一家餐廳,並且有一個訂單系統,顧客可以點餐,你可以使用命令模式來管理這些點餐的操作。

  1. 命令 介面:首先,你可以定義一個命令介面,例如 OrderCommand,其中包含一個 execute() 方法。

  2. 具體命令:然後,為每個可能的點餐操作創建具體命令的類別,每個類別實現了命令介面,並包含實際執行點餐操作的程式碼。
    例如,你可以創一個 AddItemToOrderCommand 類別,其中的 execute() 方法負責將菜添加到訂單中。

  3. 接收者:接收者可以是餐廳的點餐系統,負責處理訂單操作。具體命令類別可能需要一個接收者物件的reference,以便在 execute() 方法中執行相對應的點餐操作。

  4. 服務生或系統:服務生或訂單系統可以被視為呼叫者,他們接收顧客的點餐請求,將這些請求轉換為具體命令物件,然後執行 execute() 方法以完成點餐操作,而不需要知道實際執行的操作細節。

使用命令模式,我們可以輕鬆地擴展點餐系統,添加新的菜單、修改現有菜單或加上一些特殊優惠,而不需要修改服務生或訂單系統的程式碼。
除此之外,我們可以輕鬆撤銷一些不會再用到的功能,以方便修改或取消訂單。

命令模式的包含的元素


  1. 命令介面(Command Interface):
    它定義了執行具體命令的方法,通常包括 execute() 方法。這個介面可能還有其他運算,如 undo() 用於撤銷操作。

  2. 具體命令(ConcreteCommand):
    這些類別實現了命令介面,並包含了實際執行操作的邏輯。每個具體命令通常關聯到一個接收者物件,並在 execute() 方法中呼叫接收者的相應操作。

  3. 接收者(Receiver):
    接收者是執行實際操作的對象。命令模式將操作的執行從發出命令的對象(客戶端)分離出來,並交給接收者。

  4. 呼叫者(Invoker):
    呼叫者是負責向具體命令對象發出命令的對象,它不需要了解具體命令的細節。呼叫者通常保持一個或多個命令對象的引用,並在需要時呼叫它們的 execute() 方法。

  5. 客戶端(Client):
    客戶端是使用命令模式的程式的一部分,它創建具體命令對象、設定接收者和呼叫者,並將命令對象添加到呼叫者中。

命令模式的優點


命令模式的優點包括:

  • 分離命令的發送者和接收者,使系統更容易擴展和維護。
  • 可以取消和重做操作,因為命令對象可以保留其狀態。
  • 允許構建具有可擴展操作的系統,例如支持巨集(macro)命令。

這個模式在許多地方中都有應用,包括圖形用戶界面(GUI)的按鈕和菜單操作、多執行緒(multi-threading)的command queue、遙控器控制等~

UML



上一篇
[Day19] Design Pattern - Chain of Responsibility 責任鏈模式
下一篇
[Day21] Design Pattern - Interpreter解釋器模式
系列文
Design Pattern - 無所不在的設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言