命令模式(C++)

简述

    命令模式能比较容易的设计一个命令队列,在需要的情况下可以将命令计入日志,接收请求的一方可以否决请求。而且加进新的具体命令类不影响其他的类,因此可以比较容易的增加新的具体的命令类。

场景说明

    相信大家都去过饭店吧。去了之后,首先叫服务员过来点菜,有炒饭,烧茄子,烤鱼等等(我最喜欢吃的),服务员会记录下菜名,然后交到厨房,厨师做饭。应该没有人会直接跑到后厨让厨师做饭吧,也没有人会一个一个的点,都会全部点完后再让服务员送过去的。这个场景与命令模式非常相似,点的菜名就是一个个的命令,菜单就是存放命令的容器,服务员就是控制命令集的人,厨师就是具体执行命令的。

UML类图


对象职责

Waiter: 命令管理者,负责命令的增加,删除和执行管理。
Order: 抽象命令类
RoastedEggplant: 烧茄子命令,封装好的具体命令
EggFriedRice: 炒饭命令,封装好的具体命令
RosatFish:烤鱼命令,封装好的具体命令
Chef: 厨师,命令具体的执行者,组合于具体的命令

代码实现

#include <stdio.h>

#include <vector>
#include <iostream>
#include <list>

//厨师
class Chef
{
public:
	void getEggFriedRice()
	{
		std::cout << "炒饭好了" << std::endl;
	}
	void getRoastedEggplant()
	{
		std::cout << "烧茄子好了" << std::endl;
	}
	void getRoastFish()
	{
		std::cout << "烤鱼好了" << std::endl;
	}
private:
};

//抽象命令
class Order
{
public:
	Order(Chef *chef)
	{
		mChef = chef;
	}

	virtual void ExecuteOrder(){}

protected:
	Chef *mChef;
};

//炒饭
class EggFriedRice : public Order
{
public:
	EggFriedRice(Chef *chef) : Order(chef){}

	virtual void ExecuteOrder()
	{
		mChef->getEggFriedRice();
	}
};
//烧茄子
class RoastedEggplant : public Order
{
public:
	RoastedEggplant(Chef *chef) : Order(chef){}

	virtual void ExecuteOrder()
	{
		mChef->getRoastedEggplant();
	}
};
//烤鱼
class RoastFish : public Order
{
public:
	RoastFish(Chef *chef) : Order(chef){}

	virtual void ExecuteOrder()
	{
		mChef->getRoastFish();
	}
}; 

class Waiter
{
public:
	Waiter(){};
	~Waiter(){};

	void addOrder(Order* order)
	{
		mOrderVector.push_back(order);


	}
	void emptyOrder()
	{
		mOrderVector.clear();
	}
	void ExecuteOrderList()
	{
		for (std::list<Order*>::iterator it = mOrderVector.begin(); it != mOrderVector.end(); it++)
		{
			(*it)->ExecuteOrder();
		}
	}
private:
	std::list<Order*> mOrderVector;
};


int main()
{
	Chef *chef = new Chef;

	Order* eggFriedRice = new EggFriedRice(chef);
	Order* roastedEggplant = new RoastedEggplant(chef);
	Order* roastFish = new RoastFish(chef);

	Waiter *waiter = new Waiter;
	waiter->addOrder(eggFriedRice);
	waiter->addOrder(roastedEggplant);
	waiter->addOrder(roastFish);
	waiter->ExecuteOrderList();

	while (1);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值