主要概念是將請求或操作封裝成對象,以便在不同的情境下執行這些請求,同時使得我們能夠解耦發出請求的對象和實際執行請求的對象:
命令對象(Command Object):在Command模式中,命令被表示為一個對象,它包含了執行特定操作所需的所有信息,包括操作的接收者(實際執行操作的對象)、操作的方法等。這種對象將請求的發送者和接收者解耦,使得我們可以輕鬆地對請求進行擴展和修改。
接收者(Receiver):接收者是實際執行操作的對象,命令對象將操作委託給接收者來執行。這種方式使我們可以更換不同的接收者,從而實現不同的操作,同時不影響請求的發送者。
調用者(Invoker):就像一個控制器,知道如何觸發不同命令的執行,而且不需要了解命令的細節,只需知道每個命令的名稱,然後按下按鈕,就像你按遙控器上的按鈕一樣。
客戶端(Client):客戶端是使用Command模式時的程式碼,它負責創建命令對象和設置其接收者。客戶端通常是請求的發送者。
取消(Undo):Command模式的額外好處是它可以撤銷操作。因為命令對象將操作封裝起來,所以可以輕鬆實現操作的撤銷功能,只要保留相關的命令對象紀錄。
宏命令(Macro Command):宏命令是一種特殊的命令,它可以包含多個子命令,當執行宏命令時,會連續執行所有子命令,如果需要處理大量資訊的話很實用。
舉個例子,把它想像成遙控器和家電設備之間的互動:
遙控器:這是命令的發送者(Invoker),它有一系列按鈕,每個按鈕代表一個命令。
按鈕:每個按鈕代表一個命令(例如,開燈、關燈、打開音響、關閉音響)。按下按鈕就像發送了一個命令。
命令對象:每個命令都是一個獨立的對象,它知道如何執行特定的操作(例如,開燈、關燈、打開音響、關閉音響)。
家電設備:家電設備是命令的接收者(Receiver),它實際執行命令所需的操作(例如,控制燈泡或音響的狀態)。
當你按下遙控器上的按鈕時,遙控器會創建相應的命令對象,並用命令對象來執行操作,而不需要知道操作的細節。這樣,遙控器和家電設備之間的關係就可以解耦,同時也實現了操作的撤銷和批處理等功能,卻不影響現有的程式碼。
總之,Command模式的主要目標是實現請求的發送者和接收者之間的解耦,同時提供了操作的撤銷和批處理等額外功能。通過將請求封裝成對象,我們可以更靈活地設計和擴展系統,同時保持程式的可維護性,讓可讀性更高。
Disclaimer
因為讀的是原文版,所以難免會有翻譯詞不達意或是專有名詞上的差異,有錯誤的話歡迎在留言區一起交流!