设计模式C++实现十九:命令模式

命令模式(Command):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

命令模式的优点:

第一、能较容易的设计一个命令队列。

第二、在需要的情况下,可用较容易地将命令计入日志。

第三、允许接受请求的一方决定是否需要否决请求。

第四、可用容易地实现对请求的撤销和重做。

第五、由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易、

关键优点:把请求一个操作的对象与知道怎么执行一个操作的对象分割开。

如果不清楚一个系统是否需要命令模式,一般就不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销和恢复操作等功能时,把原来的代码重构为命令模式才有意义。

#ifndef COMMAND_H
#define COMMAND_H
#include<iostream>
#include<string>
#include<list>
using namespace std;
class Barbecuer
{
public:
	void BakeMutton()
	{
		cout << "烤羊肉串。\n";
	}
	void BakeChickenWing()
	{
		cout << "烤鸡翅。\n";
	}
};

class Command
{
protected:
	Barbecuer receiver;
public:
	Command(){}
	Command(Barbecuer & b) :receiver(b){}
	virtual void ExcuteCommand() = 0;
};

class BakeMuttonCommand :public Command
{
public:
	BakeMuttonCommand(Barbecuer & b) { receiver = b; }
	void ExcuteCommand(){ receiver.BakeMutton(); }
};

class BakeChickenWingCommand :public Command
{
public:
	BakeChickenWingCommand(Barbecuer & b) { receiver = b; }
	void ExcuteCommand(){ receiver.BakeChickenWing(); }
};

class Waiter
{
	list<Command *>orders;
public:
	void SetOrder(Command * comptr);
	void CancelOrder(Command * comptr);
	void Notify();
};

void Waiter::SetOrder(Command * comptr)
{
	orders.push_back(comptr);
	cout << "增加订单\n";
}

void Waiter::CancelOrder(Command * comptr)
{
	orders.remove(comptr);
	cout << "取消订单\n";
}

void Waiter::Notify()
{
	for each (Command * var in orders)
	{
		var->ExcuteCommand();
	}
}

#endif
#include "Command.h"
int main()
{
	Barbecuer boy;
	BakeChickenWingCommand bakechickenwingcommand1(boy);
	BakeChickenWingCommand bakechickenwingcommand2(boy);
	BakeMuttonCommand bakemuttoncommand1(boy);
	BakeMuttonCommand bakemuttoncommand2(boy);

	Waiter girl;
	girl.SetOrder(&bakechickenwingcommand1);
	girl.SetOrder(&bakechickenwingcommand2);
	girl.SetOrder(&bakemuttoncommand1);
	girl.SetOrder(&bakemuttoncommand2);
	girl.Notify();
	girl.CancelOrder(&bakechickenwingcommand2);
	girl.Notify();
	return 0;
}
时间: 2024-10-14 11:05:54

设计模式C++实现十九:命令模式的相关文章

Java设计模式菜鸟系列(十九)备忘录模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018967 备忘录模式(Memento): 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象. 一.uml建模: 二.代码实现 /** * 备忘录模式(Memento):主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象 * * 示例:原始类--> 创建.恢复备忘录 */ class Original { private String state; public Or

C#设计模式之十九策略模式(Stragety Pattern)【行为型】

原文:C#设计模式之十九策略模式(Stragety Pattern)[行为型] 一.引言 今天我们开始讲"行为型"设计模式的第七个模式,该模式是[策略模式],英文名称是:Stragety Pattern.在现实生活中,策略模式的例子也非常常见,例如,在一个公司中,会有各种工作人员,比如:有的是普通员工,有的是软件架构师,有的是部门经理,当然也会有公司的CEO.这些工作人员负责的工作不同,担负的责任不同,自然得到的报酬也就不同了.每种工作人员都有自己的工资,但是每个工种的工作人员的工资的

.NET设计模式(17):命令模式(Command Pattern)(转)

概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建忠].这就是本文要说的Command模式. 意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作.[GOF <设计模式>] 结构图 Command模式

设计模式(一):命令模式(1)——基本的命令模式

前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)——基本的命令模式 设计模式(一):命令模式(2)——命令模式扩展之宏命令 设计模式(一):命令模式(3)——命令模式扩展之队列请求 设计模式(一):命令模式(4)——命令模式扩展之日志请求 一.生活中的命令模式 1.案例 如果将命令模式反映到生活中,遥控器无疑是一个很好的例子.假如我们有如下一个遥控器 这个遥控器有三个插槽(编号为0,1,2),每个插槽对应着要操作的一个电器,插槽所控制的电器这里设置的分别是卧室灯.空调.冰箱,这些电

设计模式(一):命令模式(2)——命令模式扩展之宏命令

前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)——基本的命令模式 设计模式(一):命令模式(2)——命令模式扩展之宏命令 设计模式(一):命令模式(3)——命令模式扩展之队列请求 设计模式(一):命令模式(4)——命令模式扩展之日志请求 一.升级遥控器 1.需求 经过上一节的设计,我们的遥控器每个按键都具备了基本的开关功能,还有一个按键具备了撤销功能.但人类都是懒惰的,现在我们想要按下0号插槽的On按钮时就可以将电灯.空调.洗衣机打开,按下0号插槽的Off按钮时就可以将电灯.空调

设计模式(一):命令模式(4)——命令模式扩展之日志请求

前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)——基本的命令模式 设计模式(一):命令模式(2)——命令模式扩展之宏命令 设计模式(一):命令模式(3)——命令模式扩展之队列请求 设计模式(一):命令模式(4)——命令模式扩展之日志请求 一.命令模式扩展之日志请求 1.日志请求的工作方式 上一节介绍了命令模式之队列请求,本节介绍一下另一个扩展——日志请求.某些用用需要将我们所有的动作都记录在日志中,并能在系统死机之后,重新调用这些动作恢复到之前的状态.命令模式能够支持这一点.这些

设计模式(一):命令模式(3)——命令模式扩展之队列请求

前言 命令模式的讲解分为四篇: 设计模式(一):命令模式(1)——基本的命令模式 设计模式(一):命令模式(2)——命令模式扩展之宏命令 设计模式(一):命令模式(3)——命令模式扩展之队列请求 设计模式(一):命令模式(4)——命令模式扩展之日志请求 一.命令模式扩展——队列请求 1.队列请求的工作方式 上一篇说了命令模式的扩展之宏命令,本节讲解一下命令模式的第二个扩展队列请求.因为命令可以将运算块打包(一个接收者和一组动作),然后将它传来传去,就像是一般的对象一样.现在,即使命令被创建许久之

从王者荣耀看设计模式(九.命令模式)

从王者荣耀看设计模式(命令模式) 一.简介 王者荣耀是一款团队竞技游戏.良好的团队信息交流在一定程度上能帮助队伍取得胜利.为了保证游戏的流畅性与便捷性,王者荣耀提供了快捷交流机制,在王者小地图旁边有几个快捷聊天按钮(开始撤退,发起进攻,请求结合),玩家可通过点击快捷聊天按钮发出相应命令与队友进行交流 二.命令模式 命令模式(Command Pattern):命令模式是一种高内聚的模式,将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作.

设计模式(五):命令模式

一.定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 我觉得可以这样:将一个请求封装为一个对象,对请求排队或记录请求日志,以及支持可撤销的操作:从而使你可用不同的请求对客户进行参数化: 二.实例:一个遥控面板,两台小家电.一个面板控制两台小家电 2.1  不用命令模式实现 命令发起者:一块遥控器 命令接收者:一堆小家电 小家电接口: public interface ISmallAppliance { int Appid {