設計模式 命令模式

2021-08-18 07:59:40 字數 1664 閱讀 5734

命令模式,是對命令的封裝,把客戶端的請求封裝成乙個物件然後傳入系統內部。實際上是一種對命令請求、命令、執行三者的解耦設計。因此這個模式涉及到的角色中有呼叫者和接收者兩個角色,是想設計成低耦合的狀態,提高靈活性。

涉及到的角色:

抽象命令類:定義命令的統一介面。

具體命令類: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...