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),运行时表单属性验证,类型转换,强大的表达式 ...
随机推荐
- OpenCL memory object 之 Global memory (2)
转载自:http://www.cnblogs.com/mikewolf2002/archive/2011/12/18/2291584.html 当我们用clCreateBuffer, clCreate ...
- 解决IE6浏览器下position:fixed固定定位问题
像你所遇到的问题一样, IE6浏览器有太多的bug让制作网页的人头疼.这篇文章介绍的是介绍的是如何解决IE6不支持position:fixed;属性的办法.如果我们需要做某个元素始终位于浏览器的底部, ...
- [struts2]Struts遍历标签<s:iterator>总结 [转]
转至:http://blog.csdn.net/lufeng66/article/details/7338098 struts2的s:iterator 可以遍历 数据栈里面的任何数组,集合等等 以下几 ...
- javascript中String 对象slice 和substring 区别
1.slice(start,stop)和substring(start,stop) 方法都是用于提取字符串中从start开始到stop-1间的字符(因为字符串索引是从0开始).其中 start必 ...
- 利用xshell从windows上传文件到虚拟机
Xshell实现Windows上传文件到Linux主机 经常有这样的需求,我们在Windows下载的软件包,如何上传到远程Linux主机上?还有如何从Linux主机下载软件包到Windows下:之前我 ...
- HDOJ--4786--Fibonacci Tree【生成树】
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4786 题意:给出n个点,m条边,和边的信息. 边有两种颜色,白色和黑色.现要求构造一个生成树.看是否能满足 ...
- 打造强势智能手表平台:Testin云測携手索尼招募全球开发人员
打造强势智能手表平台:Testin云測携手索尼招募全球开发人员 2014/10/27 · Testin · 业界资讯 日前,全球最大的移动游戏.应用真机和用户云測试平台Testin云測宣布联手索尼公司 ...
- iTunes无法验证服务器“s.mzstatic.com.”的身份
修改hosts文件,在里面添上一行 23.214.233.166 s.mzstatic.com
- javascript中的call()和apply应用
在javascript开发过程中,如果有看过几个javascirpt代码库,就会发现经常使用到call()和apply()函数,call()和aplly()结合javascript允许传递函数名,这种 ...
- CSS伪类选择器和伪元素选择器
CSS的伪类选择器常用的是link/visited/hover/active,分别对应未访问.已访问过.鼠标悬停.鼠标按下时的样式,常用于链接,使用时要按此顺序依次写CSS,不能乱 a:link{ba ...