《設計模式》 命令模式

2022-09-16 09:48:11 字數 1838 閱讀 3882

命令(command)模式屬於物件的行為模式【gof95】。命令模式又稱為行動(action)模式或交易(transaction)模式。命令模式把乙個請求或者乙個操作封裝到乙個物件中。命令模式允許系統使 同的請求把客戶端引數化,對請求排隊或者記錄請求日誌,可以提供命令的撤銷和恢復功能。

命令 對命令的封裝。命令模式把發出命令的責任和執行命令的責任分割開,委派給不同的物件。

每個命令都是乙個操作:請求的一方發出請求要求執行乙個操作;接收的一方收到請求,並執行操作。命令模式允許請求的一方和接收的一方獨立開來。使得請求的一方不必知道接收請求的一方的介面,更不必知道請求是怎麼被接收,以及操作是否執行、何時執行和怎麼被執行。

結構圖:

客戶(client)角色:建立了乙個具體命令(concretecommand)物件並確定其接收者。

命令(command)角色:宣告了乙個給所有具體命令類的抽象介面。這是乙個抽象角色。 

具體命令(concretecommand)角色:定義乙個接受者和行為之間的弱耦合;實現 execute()方法,負責呼叫接收方的相應操作。execute()方法通常叫做執方法。

接收者(receiver)角色:負責具體實施和執行乙個請求。任何乙個類都可以成為接收者,實施和執行請求的方法叫做行動方法。

在下列情況下應該慮使用命令模式:

1、使用命令模式作為"callback"在物件導向系統中的替代。"callback"講的便是先將乙個函式登記上,然後在以後呼叫此函式。

2、需要在不同的時間指定請求、將請求排隊。乙個命令物件和原先的請求發出者可以有不同的生命期。換言之,原先的請求發出者可能已經不在了,而命令物件本身仍然是活動的。這時命令的接收者可以在本地,也可以在網路的另外乙個位址。命令物件可以在串形化之後傳送到另外一台機器上去。

3、系統需要支援命令的撤消(undo)。命令物件可以把狀態儲存起來,等到客戶端需要撤銷命令所產生的效果時,可以呼叫 undo()方法,把命令所產生的效果撤銷掉。命令物件還可以提供redo()方法,以供客戶端在需要時,再重新實施命令效果。

4、如果乙個系統要將系統中的所有資料更新到日誌日誌裡,以便在系統崩潰時,可以根據日誌裡讀回所有的資料更新命令,重新呼叫 execute()方法一條一條執行這些命令,從而恢復系統在崩潰前所做的資料更新。

5、乙個系統需要支援交易(transaction)。乙個交易結構封裝了一組資料更新命令。使用命令模式來實現交易的結構可使系統增加新的交易型別。

有點:• 命令模式使新的命令很容易地被加入到系統裡。 

• 允許接收請求的一方決定是否要否決(veto)請求。 

• 能較容易地設計-個命令佇列。 

• 可以容易地實現對請求的 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...