今天吃中飯時有個有趣的對話...
主管說會不會哪天看著以前自己寫的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
命令模式是一種行為型模式,它可以將一個請求轉換成一個擁有包含請求資訊的獨立物件。這種轉換使你能夠將請求作為方法引數傳遞,延遲或佇列請求的執行,並實現可撤銷的操作。
假設經營一家餐廳,並且有一個訂單系統,顧客可以點餐,你可以使用命令模式來管理這些點餐的操作。
命令 介面:首先,你可以定義一個命令介面,例如 OrderCommand
,其中包含一個 execute()
方法。
具體命令:然後,為每個可能的點餐操作創建具體命令的類別,每個類別實現了命令介面,並包含實際執行點餐操作的程式碼。
例如,你可以創一個 AddItemToOrderCommand
類別,其中的 execute()
方法負責將菜添加到訂單中。
接收者:接收者可以是餐廳的點餐系統,負責處理訂單操作。具體命令類別可能需要一個接收者物件的reference,以便在 execute()
方法中執行相對應的點餐操作。
服務生或系統:服務生或訂單系統可以被視為呼叫者,他們接收顧客的點餐請求,將這些請求轉換為具體命令物件,然後執行 execute()
方法以完成點餐操作,而不需要知道實際執行的操作細節。
使用命令模式,我們可以輕鬆地擴展點餐系統,添加新的菜單、修改現有菜單或加上一些特殊優惠,而不需要修改服務生或訂單系統的程式碼。
除此之外,我們可以輕鬆撤銷一些不會再用到的功能,以方便修改或取消訂單。
命令介面(Command Interface):
它定義了執行具體命令的方法,通常包括 execute()
方法。這個介面可能還有其他運算,如 undo()
用於撤銷操作。
具體命令(ConcreteCommand):
這些類別實現了命令介面,並包含了實際執行操作的邏輯。每個具體命令通常關聯到一個接收者物件,並在 execute()
方法中呼叫接收者的相應操作。
接收者(Receiver):
接收者是執行實際操作的對象。命令模式將操作的執行從發出命令的對象(客戶端)分離出來,並交給接收者。
呼叫者(Invoker):
呼叫者是負責向具體命令對象發出命令的對象,它不需要了解具體命令的細節。呼叫者通常保持一個或多個命令對象的引用,並在需要時呼叫它們的 execute()
方法。
客戶端(Client):
客戶端是使用命令模式的程式的一部分,它創建具體命令對象、設定接收者和呼叫者,並將命令對象添加到呼叫者中。
命令模式的優點包括:
這個模式在許多地方中都有應用,包括圖形用戶界面(GUI)的按鈕和菜單操作、多執行緒(multi-threading)的command queue、遙控器控制等~