命令模式,是對命令的封裝,把客戶端的請求封裝成乙個物件然後傳入系統內部。實際上是一種對命令請求、命令、執行三者的解耦設計。因此這個模式涉及到的角色中有呼叫者和接收者兩個角色,是想設計成低耦合的狀態,提高靈活性。
涉及到的角色:
抽象命令類:定義命令的統一介面。
具體命令類:command介面的實現者,用來執行具體的命令,某些情況下可以直接用來充當receiver。
接收者:命令的實際執行者
請求者:命令的請求者,是命令模式中最重要的角色。這個角色用來對各個命令進行控制。
意圖:將乙個請求封裝成乙個物件,從而使您可以用不同的請求對客戶進行引數化。
主要解決:在軟體系統中,行為請求者與行為實現者通常是一種緊耦合的關係,但某些場合,比如需要對行為進行記錄、撤銷或重做、事務等處理時,這種無法抵禦變化的緊耦合的設計就不太合適。
何時使用:在某些場合,比如要對行為進行"記錄、撤銷/重做、事務"等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將"行為請求者"與"行為實現者"解耦?將一組行為抽象為物件,可以實現二者之間的松耦合。
如何解決:通過呼叫者呼叫接受者執行命令,順序:呼叫者→命令→接受者。
關鍵**:定義三個角色:1、received 真正的命令執行物件 2、command 3、invoker 使用命令物件的入口
應用例項:struts 1 中的 action 核心控制器 actionservlet 只有乙個,相當於 invoker,而模型層的類會隨著不同的應用有不同的模型類,相當於具體的 command。
優點: 1、降低了系統耦合度。 2、新的命令可以很容易新增到系統中去。
缺點:使用命令模式可能會導致某些系統有過多的具體命令類。
使用場景:認為是命令的地方都可以使用命令模式,比如: 1、gui 中每乙個按鈕都是一條命令。 2、模擬 cmd。
注意事項:系統需要支援命令的撤銷(undo)操作和恢復(redo)操作,也可以考慮使用命令模式,見命令模式的擴充套件。
**如下:
<?php
//命令抽象類
abstract class command
//具體命令類-可以根據不同情況有多個繼承具體類
class concretecommand extends command
function excute() }
//接受者類
class receiver
}//呼叫者
class invoker
function action() }
//呼叫
//不使用呼叫者類呼叫
$receiver = new receiver();
$command = new concretecommand($receiver);
$command->excute();
//使用呼叫者類
$invoker = new invoker($command);
$invoker->action();
?>
設計模式 命令設計模式
一句話總結 命令設計模式的實質是將命令定義,命令的執行分離開,從而提公升了系統的解藕性 結構 命令的抽象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...