Command 模式
Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现
者之间的解耦。
Command 模式结构图中,将请求的接收者(处理者)放到 Command 的具体子类
ConcreteCommand 中,当请求到来时(Invoker 发出 Invoke 消息激活 Command 对象) ,
ConcreteCommand 将处理请求交给 Receiver对象进行处理。
////////////Command.h//////////////////////////////////////////////////////////////
#pragma once
class Reciever;
class Command
{
public:
virtual ~Command();
virtual void Excute() = ;
protected:
Command();
private:
}; class ConcreteCommand1 : public Command
{
public:
~ConcreteCommand1();
ConcreteCommand1(Reciever* rec);
void Excute() ;
protected:
private:
Reciever* _rec ;
}; class ConcreteCommand2 : public Command
{
public:
~ConcreteCommand2();
ConcreteCommand2(Reciever* rec);
void Excute() ;
protected:
private:
Reciever* _rec ;
};
/////////Command.cpp/////////////////////////////////////////////////////////////////
#include "Command.h"
#include "Reciever.h"
Command::Command()
{ }
Command::~Command()
{ } ConcreteCommand1::ConcreteCommand1(Reciever* rec)
{
this->_rec = rec ;
}
void ConcreteCommand1::Excute()
{
this->_rec->Action1();
} ConcreteCommand1::~ConcreteCommand1()
{
delete _rec;
} ConcreteCommand2::ConcreteCommand2(Reciever* rec)
{
this->_rec = rec ;
}
void ConcreteCommand2::Excute()
{
this->_rec->Action2();
} ConcreteCommand2::~ConcreteCommand2()
{
delete _rec;
}
//////////////Invoker.h////////////////////////////////////////////////////////////
#pragma once
#include <vector> class Command;
class Invoker
{
public:
void setcmd(Command* cmd);
void Notify();
protected:
private:
std::vector<Command*> _cmds ;
};
//////Invoker.cpp////////////////////////////////////////////////////////////////////
#include "Invoker.h"
#include "Command.h"
#include <vector>
#include <iostream>
using namespace std;
void Invoker::setcmd(Command* cmd)
{
this->_cmds.push_back(cmd);
cout<<"增加请求"<<endl;
} void Invoker::Notify()
{
vector<Command*>::const_iterator it = _cmds.begin();
for (;it != _cmds.end() ; it++)
{
(*it)->Excute();
}
}
////////////Reciever.h//////////////////////////////////////////////////////////////
#pragma once
class Reciever
{
public:
~Reciever();
Reciever();
void Action1();
void Action2();
protected:
private:
};
/////////Reciever.cpp/////////////////////////////////////////////////////////////////
#include "Reciever.h"
#include <iostream>
using namespace std ;
Reciever::Reciever()
{ }
Reciever::~Reciever()
{ }
void Reciever::Action1()
{
cout<<"处理具体的请求1"<<endl;
} void Reciever::Action2()
{
cout<<"处理具体的请求2"<<endl;
}
////////main.cpp//////////////////////////////////////////////////////////////////
#include "Command.h"
#include "Invoker.h"
#include "Reciever.h"
#include <iostream>
using namespace std;
int main()
{
Reciever* rec = new Reciever();//创建处理者
Invoker* inv = new Invoker();//创建请求者 Command* cmd1 = new ConcreteCommand1(rec);
Command* cmd2 = new ConcreteCommand2(rec); //得到请求
inv->setcmd(cmd1);
inv->setcmd(cmd2); //发出请求
inv->Notify(); getchar();
return ;
}
Command 模式的更多相关文章
- C++基础——模拟事务 (1)COMMAND模式
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- Command模式
Command模式只是封装了一个没有任何变量的函数. interface Command{ void Excute();} 具有强烈的分解功能的味道.把函数层面的任务提升到了类的层面(一个类仅仅是为了 ...
- 敏捷软件开发(3)---COMMAND 模式 & Active Object 模式
COMMAND 模式 command模式非常简单,简单到你无法想象的地方. public interface Command { void execute(); } 这就是一个command模式的样子 ...
- 条款19 command 模式与好莱坞法则
当一个函数对象被当做回调时候,就是一个command模式的实例 什么是回调? 回调就是框架知道什么时候干一些事情,但是具体干什么,或许框架一无所知(因为回调函数不是他设计的),而用户则知道发生一个特定 ...
- 开发设计模式(一)Command模式
Command定义 将来自客户端的请求传入一个对象,无需了解这个请求激活的 动作或有关接受这个请求的处理细节. 这是一种两台机器之间通讯联系性质的模式,类似传统过程语 言的 CallBack功能. 优 ...
- 【行为型】Command模式
命令模式是指将用户的请求封装成(命令)对象,从而可将用户不同的请求进行参数化.对这些请求排序或记录请求日志.以及支持回滚恢复操作.记得以前刚开始使用Photoshop时,就发现它的操作历史记录面板特别 ...
- [译]使用Command模式和MediatR简化你的控制器
原文 你希望保持你的controller足够简单. 你的controller越来越臃肿,你听说command模式是一个给controller瘦身的解决方案. 但是你不知道command模式是否适合你的 ...
- Java设计模式(22)命令模式(Command模式)
Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...
- Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来。Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph NavigationLanguage),IoC(Inversion of Control反转控制)容器等。 ----------------
Xwork概况 XWork是一个标准的Command模式实现,并且完全从web层脱离出来.Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式 ...
随机推荐
- Bzoj1818: [Cqoi2010]内部白点 && Tyvj P2637 内部白点 扫描线,树状数组,离散化
1818: [Cqoi2010]内部白点 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 704 Solved: 344[Submit][Status] ...
- MTK Android Driver知识大全
一.Display 1.lcm 相关概念1.1) MIPI接口:一共有三种接口:DBI(也做CPU或MCU接口).DPI(也叫RGB接口).DSI.在使用DSI接口时,目前75/77都只支持到2条da ...
- flushall()函数的用法
flushall()函数 如下所示的一个非常简单的程序. #include void main(void) { char cA,cB; printf("input cA and cB:\n& ...
- phonegap与google analytics整合
用phonegap开发的app接近尾声,需要整一个谷歌分析进去. 1.首先申请一个GA帐号,在“what would you like to track”下选择APP
- Android Fragment 多标签应用
1.使用Fragment 可以方便的替代TabActivity.ViewGroup 2.同时也省去了在AndroidManifest.xml文件中 添加相应的Activity 3.Fragment 是 ...
- cf754D
题意:给你一个数m,有多少优惠券,给个n,主角想用多少优惠券.然后接下来时m行,每行两个数,那张优惠券的优惠区间a,b(在a号货物到b号货物之间的所有都可以优惠) 问你,能不能用k张优惠券,是他的优惠 ...
- kafka consumer 分区reblance算法
转载请注明原创地址 http://www.cnblogs.com/dongxiao-yang/p/6238029.html 最近需要详细研究下kafka reblance过程中分区计算的算法细节,网上 ...
- linux下网络配置 命令
一.IP的配置: 不直接修改文件方式: 设置网卡eth0的IP地址和子网掩码: sudo ifconfig eth0 192.168.2.1 netmask 255.255.255.0 将IP地址改为 ...
- apache启动目录(禁止目录)与设置默认入口文件的方法
设置默认入口文件的方法: 打开apache的conf目录,找到httpd.conf文件,打开这个文件,搜索dir_module,找到以下截图修改位置进行修改,注意重启apache服务器,修改位置才会生 ...
- Android——C语言、JNI与低层调用
JNI java native interface c的基本数据类型 int:32位,能表示的数字是2的32次方个 最高位用来表示符号位,那么还剩下31位可以表示数值,所以能表示的数字就是2的31次方 ...