命令模式(C++)

来源:互联网 发布:godaddy PHP创建 编辑:程序博客网 时间:2024/05/18 03:23

简述

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

场景说明

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

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;}