設計模式(三)命令模式

2021-09-18 03:23:31 字數 2467 閱讀 2786

在軟體開發系統中,常常出現「方法的請求者「與「方法的實現者」之間存在緊密的耦合關係。這不利於軟體功能的擴充套件與維護。例如,想對行為進行「撤銷、重做、記錄」等處理都很不方便,因此「如何將方法的請求者與方法的實現者解耦?」變得很重要,命令模式能很好地解決這個問題。

在現實生活中,這樣的例子也很多,例如,電視機遙控器(命令傳送者)通過按鈕(具體命令)來遙控電視機(命令接收者),還有計算機鍵盤上的「功能鍵」等。

官方定義:command pattern(命令模式)是乙個高內聚的模式。將乙個請求封裝成乙個物件,使發出請求的責任和執行請求的責任分割開。這樣兩者之間通過命令物件進行溝通,這樣方便將命令物件進行儲存、傳遞、呼叫、增加與管理。

命令模式包含以下主要角色。

抽象命令類(command)角色:宣告執行命令的介面,擁有執行命令的抽象方法 execute()。

具體命令角色(concrete    command)角色:是抽象命令類的具體實現類,它擁有接收者物件,並通過呼叫接收者的功能來完成命令要執行的操作。

實現者/接收者呼叫者/請求者

類圖如下:

我們用吃早餐來舉例說明命令模式吧。

分析:客戶去餐館可選擇的早餐有腸粉、餛飩、油條等,客戶可向服務員選擇以上早餐中的若干種,服務員將客戶的請求交給相關的廚師去做。這裡的點早餐相當於「命令」,服務員相當於「呼叫者」,廚師相當於「接收者」,所以用命令模式實現比較合適。

降低系統的耦合度。命令模式能將呼叫操作的物件與實現該操作的物件解耦。

增加或刪除命令非常方便。採用命令模式增加與刪除命令不會影響其他類,它滿足「開閉原則」,對擴充套件比較靈活。

可以實現巨集命令。命令模式可以與組合模式結合,將多個命令裝配成乙個組合命令,即巨集命令。

方便實現 undo 和 redo 操作。命令模式可以與後面介紹的備忘錄模式結合,實現命令的撤銷與恢復。

可能產生大量具體命令類。因為計對每乙個具體操作都需要設計乙個具體命令類,這將增加系統的複雜性。

命令模式通常適用於以下場景。

當系統需要將請求呼叫者與請求接收者解耦時,命令模式使得呼叫者和接收者不直接互動。

當系統需要隨機請求命令或經常增加或刪除命令時,命令模式比較方便實現這些功能。

當系統需要執行一組操作時,命令模式可以定義巨集命令來實現該功能。

當系統需要支援命令的撤銷(undo)操作和恢復(redo)操作時,可以將命令物件儲存起來,採用備忘錄模式來實現。

設計模式 命令設計模式

一句話總結 命令設計模式的實質是將命令定義,命令的執行分離開,從而提公升了系統的解藕性 結構 命令的抽象command 命令的具體實現concretecommand 命令處理者抽象ireceiver 命令處理者的具體實現concretereceiver 命令的呼叫者invoker 客戶端client...

設計模式 命令模式

1 命令模式的角色組成 1 命令角色 command 生命執行操作的介面。介面或抽象類來實現。2 具體命令角色 concrete command 將乙個接收者物件繫結於乙個動作 呼叫接收者相應的操作,以實現命令角色宣告的執行操作的介面。3 客戶角色 client 建立乙個具體命令物件 並可以設定它的...

設計模式 命令模式

1 command.h ifndef command h define command h include include include using namespace std class chef 廚師,具體命令的執行者 class command 命令基類 class makemuttonco...