设计模式观后(c++还原之十二 命令模式)

来源:互联网 发布:ubuntu进图形界面 编辑:程序博客网 时间:2024/05/16 02:10

以前在github给自己写日记习惯了,现在csdn写东西还是要更加规范点,以后还是写完全能编译的代码吧!


#include <iostream>#include <stdlib.h>#include <string>#include <list>#include <vector>#include <map>using std::map;using std::endl;using std::cout;using std::list;using std::vector;using std::string;//命令模式//作者前面的设计感觉可以归纳为,类的函数封装与类之间的父子关系。//最近的两个模式让我觉得,作者已经开始进入;类与类的关系,类与类的调用与封装了。//先看命令模式的示例: 需求组、美工组、代码组、客户类每增加一个需求就会多次无序调用这三个组//所以需要设计一个类似中介的类class Group {//抽象组类,作者一贯习惯public:virtual void Find() = 0;virtual void Add() = 0;virtual void Delete() = 0;virtual void Change() = 0;virtual void Plan() = 0;};//分别实现三组class RequirementGroup : public Group {public:void Find() {cout << "require find" << endl;}void Add() {cout << "require add" << endl;}void Change() {cout << "require change" << endl;}void Plan() {cout << "require plan" << endl;}void Delete() {cout << "require delete" << endl;}};class PageGroup : public Group {public:void Find() {cout << "page find" << endl;}void Add() {cout << "page add" << endl;}void Change() {cout << "page change" << endl;}void Plan() {cout << "page plan" << endl;}void Delete() {cout << "page delete" << endl;}};class CodeGroup : public Group {public:void Find() {cout << "code find" << endl;}void Add() {cout << "code add" << endl;}void Change() {cout << "code change" << endl;}void Plan() {cout << "code plan" << endl;}void Delete() {cout << "code delete" << endl;}};//封装客户的命令,产生命令类class Command {protected:RequirementGroup* p_rg;PageGroup*  p_pg;CodeGroup*  p_cg;public:Command(): p_rg(new RequirementGroup), p_pg(new PageGroup), p_cg(new CodeGroup){}virtual void execute() = 0;};class AddRequirementCommand : public Command {public://客户添加需求void execute() {p_rg->Find();p_rg->Add();p_rg->Plan();}};class DeletePageCommand : public Command {public:void execute() {p_pg->Find();p_rg->Delete();p_rg->Plan();}};class Invoker {private:Command* p_command;public:void SetCommand(Command* p_c) {p_command = p_c;}void action() {p_command->execute();}};class Client {public:static void Main() {//删除页面操作Invoker* p_in = new Invoker;Command* p_co = new DeletePageCommand;p_in->SetCommand(p_co);p_in->action();}};
<span style="font-family: Arial, Helvetica, sans-serif;">//命令模式基本三个角色</span>
<pre name="code" class="cpp">//接收者(工作组)、命令者(command)、调用者(invoker).都要看情况设置抽象类和具体类//扩展,添加命令就好


int _tmain(int argc, _TCHAR* argv[]){Client::Main();system("pause");return 0;}




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 泡鱿鱼干没有碱怎么办 彩虹6号买了68怎么办 r6买了乞丐版怎么办 狙击精英3闪退怎么办 踩到地雷怎么办 知乎 蛋糕海绵灌胶了怎么办 蝴蝶的翅膀断了怎么办 培乐多彩泥干了怎么办 ps4被ban机了怎么办 塔吊离建筑物8米怎么办 手表带掉边缘皮怎么办 脸皮肤过敏痒肿怎么办 脸过敏发红发肿怎么办 皮肤过敏又红又肿怎么办 春天脸过敏发红痒怎么办 皮卡车后斗生锈怎么办 没带卸妆的东西怎么办 审车尾气过不了怎么办 违章停车条丢了怎么办 停车被城管贴条怎么办 违停告知单丢了怎么办 交通事故责任认定书不服怎么办 对交通事故认定书有异议怎么办 老婆不让我碰她怎么办 车被城管拖走了怎么办 共享汽车没油了怎么办 车被蹭了人跑了怎么办 遇见碰瓷的人怎么办 遇到老人碰瓷的怎么办 打了碰瓷的怎么办 倒车入库打晚了怎么办 上班停车费太贵怎么办 黄疸回家小孩不爱吃母乳怎么办 黄金棒开关坏了怎么办 在一家莆田系医院上班怎么办 被莆田医院骗了怎么办 痘痘红肿有脓包怎么办 换届选举候选人自动退出竞选怎么办 城管暴力执法导致老百姓受伤怎么办 领导制定方案与政策不一致怎么办 第三方支付存在的金融风险怎么办