我有一个朋友,他是个大忙人,每天的行程表都是塞得满满的,要预约他可不容易。关键是,刚开始他还是邋里邋遢的,并没有一个明确的日程表。这就导致了三个问题: 1、我们不知道什么时候可以约他,就只能直接把预约请求扔给他。 后来,他有了秘书。 真是大牌,秘书都用上了。 这里又隐藏着一个设计模式 – 命令模式 命令模式:将一个请求封装成一个对象,从而可以使你用不同的请求对客户进行参数化、对请求排队或记录请求日志、以及支持可撤销的操作。 这里囊括了解约、记录、针对不同任务等模块,我在网上其他地方是没找到用C++有实现这个的。 命令模式通常适用于以下场景。
文章目录
预约“大牌”的困扰
2、他有时候都不知道回复我们的预约,有时候预约了他又忘记了,忙嘛。
3、我们不方便单方面解约,毕竟人家百忙之中还抽空出来嘛。
1、我们预约他,给他的秘书说一下就好。
2、他的秘书会提醒他佳人有约。
3、我们要取消约定,跟他的秘书说一下就好了。命令模式
上面这图可能抽象了点啊,没事儿,咱不是有故事嘛。
再来一张就是了。小故事的代码完整实现
#include<iostream> #include<list> using namespace std; //大忙人类 class BusyMan { public: void Dinner() { cout << "晚餐" << endl; } void Game() { cout << "打游戏" << endl; } }; //抽象命令类 class AbsCommand { protected : BusyMan *man; string state; //命令参数 public: AbsCommand(BusyMan* man) { this->man = man; } string getState() { return state; } //执行命令 virtual void excuteCommand() = 0; }; //吃晚饭预约 class DinnerCommand :public AbsCommand { public: DinnerCommand(BusyMan* man) :AbsCommand(man) { this->state = "晚饭"; }; void excuteCommand() { man->Dinner(); } }; //打游戏预约 class GameCommand :public AbsCommand { public: GameCommand(BusyMan* man) :AbsCommand(man) { this->state = "打游戏"; }; void excuteCommand() { man->Game(); } }; //秘书类 class selary { private: list<AbsCommand*> AC; public: //安排预约 void SetOrder(AbsCommand* abs) { if (abs->getState() == "晚饭") cout << "没空" << endl; else { AC.push_back(abs); cout << "预约成功,请于XX:XX准时上线快乐双排" << endl; //这里可以再加个写入配置文件的 } } //解约 void cancelOrder(AbsCommand* abs){ AC.remove(abs); cout << "解约成功" << endl; } void notify(){ list<AbsCommand*>::iterator it = AC.begin(); while (it != AC.end()) { (*it)->excuteCommand(); it++; } AC.clear(); } }; int main() { BusyMan* man = new BusyMan(); AbsCommand* d = new DinnerCommand(man); AbsCommand* g1 = new GameCommand(man); AbsCommand* g2 = new GameCommand(man); selary* s = new selary(); s->SetOrder(d); s->SetOrder(g1); s->notify(); s->SetOrder(g1); s->SetOrder(g2); s->cancelOrder(g1); s->notify(); return 0; }
应用场景
当系统需要将请求调用者与请求接收者解耦时,命令模式使得调用者和接收者不直接交互。 当系统需要随机请求命令或经常增加或删除命令时,命令模式比较方便实现这些功能。 当系统需要执行一组操作时,命令模式可以定义宏命令来实现该功能。 当系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作时,可以将命令对象存储起来,采用备忘录模式来实现。
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算