1. 程式人生 > >C++設計模式——命令模式

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與設計模式--命令模式

一、飯店點餐系統 又是一個點餐系統(原諒作者的吃貨屬性)。不過這次的點餐系統是個飯店的點餐系統。飯店的點餐系統有什麼不同嘛?大夥想想看,在大多數飯店中,當服務員已經接到顧客的點單,錄入到系統中後,根據不同的菜品,會有不同的後臺反應。比如,飯店有冷盤間、熱菜間、主食間,那當服務員將菜品錄入到系統中後,冷盤間會