简述
命令模式能比较容易的设计一个命令队列,在需要的情况下可以将命令计入日志,接收请求的一方可以否决请求。而且加进新的具体命令类不影响其他的类,因此可以比较容易的增加新的具体的命令类。
场景说明
相信大家都去过饭店吧。去了之后,首先叫服务员过来点菜,有炒饭,烧茄子,烤鱼等等(我最喜欢吃的),服务员会记录下菜名,然后交到厨房,厨师做饭。应该没有人会直接跑到后厨让厨师做饭吧,也没有人会一个一个的点,都会全部点完后再让服务员送过去的。这个场景与命令模式非常相似,点的菜名就是一个个的命令,菜单就是存放命令的容器,服务员就是控制命令集的人,厨师就是具体执行命令的。
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;
}