C++設計模式——命令模式
1定義
將一個請求封裝成一個物件,從而讓你使用不同的請求把客戶端引數化,對請求佇列或者記錄請求日誌,可以提供命令的撤銷和恢復功能
2類圖
角色描述:
Receiver接受者角色,就是幹活的碼農,命令傳遞打這裡就應該被執行。
Command命令角色,對命令額封裝,所有命令宣告在此
Invoker呼叫者角色,接受到命令並且執行命令
class Receiver { protected: Receiver(); public: virtual ~Receiver() = 0; virtual void doSomething()=0; }; class ConcreteReceiver:public Receiver { public: void doSomething() { cout << "doSomething...."<<endl; } }; claas Command { protected: Command(); public: virtual ~Command() = 0; virtual void execute() = 0; }; class ConcreteCommand:public Command { public: ConcreteCommand(Receiver* re) :_receiver(re) {} ~ConcreteCommand(){} void execute() { _receiver.doSomething(); } protected: Receiver * _receiver; }; class Invoke { private: Command * _cmd; public: void setCommand(Command * cmd) { _cmd = cmd; } void action() { _cmd->execute(); } };
4應用
① 優點
類間解耦
可擴充套件性
結合其他模式更加優秀:結合責任鏈模式實現命令族解析任務;結合模板方法,減少Command子類的膨脹
②缺點
命令越多,類約膨脹,需要慎用
③使用場景
只要認為是命令的地方。eg GUI 開發,按鈕,DOS命令模擬,觸發反饋機制的處理等
5擴充套件
①當一個命令需要多個接收者/執行者時,可以在命令內set多個接受者,完成通力合作的問題
②反悔問題,這個就設計備忘錄模式了。或者通過反向鏈式儲存機制得到前次記錄,實現回滾。rollback
注:在專案中,約定的優先順序最高,每個命令都是對一個或者多個接受者的封裝。在專案中可以通過有意義的命名來實現Client和Receiver間的依賴描述
6提升
可以將接受者在Command中進行封裝以及預設的指定。從而命令的單一職責,與接受者無關 且 高層無需瞭解呼叫時的接受者是誰
7命令模式練習
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <list> using namespace std; //命令的最終執行者 class Cooker { public: //烤串 void makeChuaner() { cout << "烤串師傅進行了烤串" << endl; } //烤雞翅 void makeChicken() { cout << "烤串師傅進行了烤雞翅" << endl; } }; //烤串的 抽象的 選單 class Command { public: Command(Cooker *cooker) { this->cooker = cooker; } ~Command() { if (this->cooker != NULL) { delete this->cooker; this->cooker = NULL; } } //選單讓最終的執行者幹活的方法 virtual void execute() = 0; protected: Cooker *cooker; }; //烤串的選單 class CommandChuaner :public Command { public: CommandChuaner(Cooker *cooker) : Command(cooker) {} virtual void execute() { //命令 最終讓執行者乾的工作。 this->cooker->makeChuaner(); } }; //烤雞翅的選單 class CommandChicken :public Command { public: CommandChicken(Cooker * cooker) : Command(cooker) {} virtual void execute() { //命令 最終讓執行者乾的工作。 this->cooker->makeChicken(); } }; //管理所有命令的一個模組 //服務員MM class Waitress { public: //給服務員新增選單的方法 void setCmd(Command *cmd) { this->cmd_list.push_back(cmd); } //讓服務員mm 下單 void notify() { list<Command *>::iterator it = cmd_list.begin(); for (; it != cmd_list.end(); it++) { (*it)->execute(); //在此發生了多型 } } private: list<Command *> cmd_list; }; int main(void) { Waitress *mm = new Waitress; Command *chuanger = new CommandChuaner(new Cooker); Command *chicken = new CommandChicken(new Cooker); //把訂單都給服務員 mm->setCmd(chuanger); mm->setCmd(chicken); //讓服務員下單,最終讓師傅幹活 mm->notify(); delete mm; return 0; }
相關推薦
設計模式——命令模式(C++實現)
clear cto ive pre urn bak std oot style 1 [root@ ~/learn_code/design_pattern/19_order]$ cat order.cpp 2 #include <
C#設計模式-命令模式
using System; namespace TestCSharp { class Program { static void Main(string[] args) { Worker worker = new Soldie
C++設計模式——命令模式
1定義 將一個請求封裝成一個物件,從而讓你使用不同的請求把客戶端引數化,對請求佇列或者記錄請求日誌,可以提供命令的撤銷和恢復功能 2類圖 角色描述: Receiver接受者角色,就是幹活的碼農,命令傳遞打這裡就應該被執行。 Command命令角色,對命令額封裝
《大話設計模式》讀書筆記之C++實現--chapter23命令模式
#include <iostream> #include <algorithm> #include <list> #include <vector> #include <QCoreApplication>
設計模式——命令模式
tro dht asf tmc qdt idt faac tms oba 命令模式屬於對象的行為模式。命令模式又稱為行動(Action)模式或交易(Transaction)模式。 命令模式把一個請求或者操作封裝到一個對象中。命令模式允許系統使用不同的請求把客戶端參數
設計模式-命令模式(行為)、責任鏈模式(行為)
tst 是否 return 執行 mman cpp lap 2.0 兩種 0 命令模式和責任鏈模式 命令模式和責任鏈模式是兩種完全相反的模式。 命令模式是需要將請求排隊處理。因此將請求封裝成對象放入隊列。 而責任鏈模式則是,可能同一對象需要多個函數只有一個函數能處理。或是多
設計模式-命令模式
設計模式 命令模式 class User { public string name { get; set; } public void Action(string command) { Console.WriteLine(
PHP設計模式 - 命令模式
命令 之間 class brush echo 行為 pre 輸出 聲明 命令模式:在軟件系統中,“行為請求者”與“行為實現者”通常呈現一種“緊耦合”。但在某些場合,比如要對行為進行“記錄、撤
設計模式-命令模式(Go語言描述)
在上一篇部落格設計模式-單例模式(Go語言描述)中我們介紹了在golang中如何去實現單例模式,在文章的最後我們也介紹到了golang獨有的一種實現單例的方式-sync.Once.Do(),可以讓golang輕鬆的實現可以應對併發請求的單利.今天我們繼續探索設計模式,來介紹一下命令模式的
重走Java設計模式——命令模式(Command Pattern)
命令模式 定義 命令模式(Command Pattern)是一種資料驅動的設計模式,它屬於行為型模式。請求以命令的形式包裹在物件中,並傳給呼叫物件。呼叫物件尋找可以處理該命令的合適的物件,並把該命令傳給相應的物件,該物件執行命令。 命令模式設計角色
用心理解設計模式——命令模式 (Commond Pattern)
前置文章: 用心理解設計模式——設計模式的原則 設計模式相關程式碼已統一放至 我的 Github 一、定義 行為型模式之一。 Encapsulate a request as an object, thereby l
設計模式 --- 命令模式
1.定義 將一個請求封裝成一個物件,從而讓使用者使用不同的請求把客戶端引數化;對請求排隊或者記錄請求日誌,以及支援可撤銷的操作。 2.使用場景 需要抽象出待執行的動作,然後以引數的形式提供出來,類似於過程設計中的回撥機制。 在不同的時刻指定、排列和執行請求。 需
大話設計模式-命令模式
命令模式 命令模式將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化,對請求排隊或記錄請求日誌,以及支援可撤銷的操作。 對於請求排隊或記錄請求日誌,以及支援可撤銷的操作,行為請求者和行為實現者的緊耦合是不合適的。 命令模式的優點 命令模式能較容易地設計一個命令模式。在
設計模式-行為型模式-命令模式
設計模式-行為型模式-命令模式 基礎 以一個MIS系統為栗子 MIS 管理資訊系統(Management Information System,MIS)是一個以人為主導的,利用計算機硬體、軟體和網路裝置,進行資訊的收集、傳遞、儲存、加工、整理的系統,以提高組織的經營效率。 程式碼如下 pu
設計模式——命令模式(遙控器與燈)
本文首發於cdream的個人部落格,點選獲得更好的閱讀體驗! 歡迎轉載,轉載請註明出處。 本文主要對命令模式進行概述講解,並使用使用遙控器與燈來講述命令模式中呼叫者與接收者的關係。 一、概述 命令模式(英語:Command pattern)是一種設計模式,它嘗試以物件來代表實際行動。命
設計模式-命令模式(Command)
命令模式:將一個請求封裝為一個物件,從而可用不同的請求對客戶進行引數化;對請求排隊或記錄日誌,以及支援可撤銷的操作,將”發出請求的物件”和”接收與執行這些請求的物件”分隔開來。 角色和職責: 1.Command: 宣告執行操作的介面 2.Concrete Co
移動開發之設計模式- 命令模式(IOS&Android)
資源 完全參照 命令模式|菜鳥教程但不包括IOS程式碼 命令模式 命令模式(Command Pattern)是一種資料驅動的設計模式,它屬於行為型模式。請求以命令的形式包裹在物件中,並傳給呼叫物件。呼叫物件尋找可以處理該命令的合適的物件,並把該命令傳給相應的物件,該物件執行命令。
Java設計模式——命令模式
概述 命令模式是把“請求動作或操作”封裝成一個“命令物件”,“呼叫者” 通過該 “命令物件” 把 “命令” 傳送到 “接收者” 執行 “操作”。(看不懂沒關係,我的文字表達水平比較一般,看例子很容易明
java設計模式-命令模式二
定義:Command模式也叫命令模式,是行為設計模式的一種。Command模式通過被稱為Command的類封裝了對目標物件的呼叫行為以及引數呼叫。 應用場景:在面向物件的設計過程中,一個物件呼叫另一個物件,一般情況一下的呼叫過程是:建立目標例項;設定呼叫引數;呼叫。 但在有些情況下有必要使用
14-Python與設計模式--命令模式
一、飯店點餐系統 又是一個點餐系統(原諒作者的吃貨屬性)。不過這次的點餐系統是個飯店的點餐系統。飯店的點餐系統有什麼不同嘛?大夥想想看,在大多數飯店中,當服務員已經接到顧客的點單,錄入到系統中後,根據不同的菜品,會有不同的後臺反應。比如,飯店有冷盤間、熱菜間、主食間,那當服務員將菜品錄入到系統中後,冷盤間會