大话设计模式C++实现-第23章-命令模式

一、UML图



二、概念

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


三、说明

角色:

(1)Command类:用来声明执行操作的接口。

(2)ConcreteCommand类:将一个接收者对象绑定与一个动作,调用接收者相应的操作,以实现Excute。

(3)Invoker类:要求该命令执行这个请求。

(4)Receiver类:知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。

命令模式的作用?

(1)命令模式能够较容易地设计一个命令队列。

(2)在需要的情况下,可以较容易地将命令记入日志。

(3)允许接收请求的一方决定是否要否决请求。

(4)可以容易地实现对请求的撤销和重做。

(5)由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。

(6)命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开。


四、C++实现

(1)Command.h

#ifndef COMMAND_H
#define COMMAND_H

#include <iostream>
#include <string>
#include <vector>
#include <ctime>

//Receiver:此处为烤羊肉串者
class Barbecuer
{
public:
	void BakeMutton()
	{
		std::cout<<"烤羊肉串!"<<std::endl;
	}
	void BakeChickenWing()
	{
		std::cout<<"烤鸡翅!"<<std::endl;
	}
};

//Command类,抽象命令
class Command
{
protected:
	Barbecuer* receiver;
public:
	Command(Barbecuer* receiver)
	{
		this->receiver=receiver;
	}
	virtual void ExcuteCommand()=0;
};

//ConcreteCommand类,具体命令
class BakeMuttonCommand:public Command
{
public:
	BakeMuttonCommand(Barbecuer* receiver):Command(receiver){}
	void ExcuteCommand()
	{
		receiver->BakeMutton();
	}
};

//ConcreteCommand类,具体命令
class BakeChickenWingCommand:public Command
{
public:
	BakeChickenWingCommand(Barbecuer* receiver):Command(receiver){}
	void ExcuteCommand()
	{
		receiver->BakeChickenWing();
	}
};

//Invoker:此处为Waiter服务员
class Waiter
{
private:
	std::vector<Command*> *orders;
public:
	Waiter()
	{
		orders=new std::vector<Command*>;
	}
	~Waiter()
	{
		delete orders;
	}
	
	//设置订单
	void SetOrder(Command* command)
	{
		//判断命令的类型并分别做不同的处理
		if(typeid(*command)==typeid(BakeChickenWingCommand))
		{
			std::cout<<"日志:服务员:鸡翅没有了,请点别的烧烤!"<<std::endl;
		}
		else if(typeid(*command)==typeid(BakeMuttonCommand))
		{
			orders->push_back(command);
			
			time_t now=time(0);
			std::cout<<"日志:增加订单:命令模式.烤羊肉串  "<<"时间:"<<asctime(gmtime(&now));
		}
		else
		{
			std::cout<<"日志:暂时没有该服务!"<<std::endl;
		}
	}

	//通知全部执行
	void Notify()
	{
		std::vector<Command*>::iterator it;
		for(it=orders->begin();it!=orders->end();it++)
		{
			(*it)->ExcuteCommand();
		}
	}
};




#endif



(2)Client.cpp

#include "Command.h"
#include <iostream>
#include <cstdlib>

void main()
{
	//开店前的准备
	Barbecuer* boy=new Barbecuer();

	Command* bakeMuttonCommand1=new BakeMuttonCommand(boy);
	Command* bakeMuttonCommand2=new BakeMuttonCommand(boy);
	Command* bakeChickenWingCommand1=new BakeChickenWingCommand(boy);

	Waiter* girl=new Waiter();

	//开门营业,顾客点菜
	girl->SetOrder(bakeMuttonCommand1);
	girl->SetOrder(bakeMuttonCommand2);
	girl->SetOrder(bakeChickenWingCommand1);

	//点菜完毕,通知厨房
	girl->Notify();

	delete boy,bakeMuttonCommand1,bakeMuttonCommand2,bakeChickenWingCommand1;
	system("pause");
}


(3)运行截图



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值