七、在什麼情況下應當使用命令模式
在下面的情況下應當考慮使用命令模式:
1、使用命令模式作為"CallBack"在面向對象系統中的替代。"CallBack"講的便是先將一個函數登記上,然後在以後調用此函數。
2、需要在不同的時間指定請求、將請求排隊。一個命令對象和原先的請求發出者可以有不同的生命期。換言之,原先的請求發出者可能已經不在了,而命令對象本身仍然是活動的。這時命令的接收者可以是在本地,也可以在網絡的另外一個地址。命令對象可以在串形化之後傳送到另外一台機器上去。
3、系統需要支持命令的撤消(undo)。命令對象可以把狀態存儲起來,等到客戶端需要撤銷命令所產生的效果時,可以調用undo()方法,把命令所產生的效果撤銷掉。命令對象還可以提供redo()方法,以供客戶端在需要時,再重新實施命令效果。
4、如果一個系統要將系統中所有的數據更新到日志裡,以便在系統崩潰時,可以根據日志裡讀回所有的數據更新命令,重新調用Execute()方法一條一條執行這些命令,從而恢復系統在崩潰前所做的數據更新。
5、一個系統需要支持交易(Transaction)。一個交易結構封裝了一組數據更新命令。使用命令模式來實現交易結構可以使系統增加新的交易類型。
八、使用命令模式的優點和缺點
命令允許請求的一方和接收請求的一方能夠獨立演化,從而且有以下的優點:
命令模式使新的命令很容易地被加入到系統裡。
允許接收請求的一方決定是否要否決(Veto)請求。
能較容易地設計-個命令隊列。
可以容易地實現對請求的Undo和Redo。
在需要的情況下,可以較容易地將命令記入日志。
命令模式把請求一個操作的對象與知道怎麼執行一個操作的對象分割開。
命令類與其他任何別的類一樣,可以修改和推廣。
你可以把命令對象聚合在一起,合成為合成命令。比如宏命令便是合成命令的例子。合成命令是合成模式的應用。
由於加進新的具體命令類不影響其他的類,因此增加新的具體命令類很容易。
命令模式的缺點如下:
使用命令模式會導致某些系統有過多的具體命令類。某些系統可能需要幾十個,幾百個甚至幾千個具體命令類,這會使命令模式在這樣的系統裡變得不實際。