设计模式--命令模式C++实现
命令模式C++实现
1定义
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求队列或者记录请求日志,可以提供命令的撤销和恢复功能
2类图

角色描述:
Receiver接受者角色,就是干活的码农,命令传递打这里就应该被执行。
Command命令角色,对命令额封装,所有命令声明在此
Invoker调用者角色,接受到命令并且执行命令
3实现
class Receiver
{
protected:
Receiver();
public:
virtual ~Receiver() = 0;
virtual void doSomething()=0;
};
class ConcreteReceiver:public Receiver
{
public:
void doSomething()
{
cout << "doSomething...."<<endl;
}
};
claas Command
{
protected:
Command();
public:
virtual ~Command() = 0;
virtual void execute() = 0;
};
class ConcreteCommand:public Command
{
public:
ConcreteCommand(Receiver* re)
:_receiver(re)
{}
~ConcreteCommand(){}
void execute()
{
_receiver.doSomething();
}
protected:
Receiver * _receiver;
};
class Invoke
{
private:
Command * _cmd;
public:
void setCommand(Command * cmd)
{
_cmd = cmd;
}
void action()
{
_cmd->execute();
}
};
4应用
① 优点
类间解耦
可扩展性
结合其他模式更加优秀:结合责任链模式实现命令族解析任务;结合模板方法,减少Command子类的膨胀
②缺点
命令越多,类约膨胀,需要慎用
③使用场景
只要认为是命令的地方。eg GUI 开发,按钮,DOS命令模拟,触发反馈机制的处理等
5扩展
①当一个命令需要多个接收者/执行者时,可以在命令内set多个接受者,完成通力合作的问题
②反悔问题,这个就设计备忘录模式了。或者通过反向链式存储机制得到前次记录,实现回滚。rollback
注:在项目中,约定的优先级最高,每个命令都是对一个或者多个接受者的封装。在项目中可以通过有意义的命名来实现Client和Receiver间的依赖描述
6 提升
可以将接受者在Command中进行封装以及默认的指定。从而命令的单一职责,与接受者无关 且 高层无需了解调用时的接受者是谁
设计模式--命令模式C++实现的更多相关文章
- linkin大话设计模式--命令模式
linkin大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...
- 【设计模式】Java设计模式 - 命令模式
Java设计模式 - 命令模式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目录 Ja ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 命令模式
用途 命令模式 (Command) 将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化:对请求排队或请求日志,以及支持可撤销的操作. 命令模式是一种行为型模式. 结构
- 深入浅出设计模式——命令模式(Command Pattern)
模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请 ...
- Java设计模式-命令模式(Command)
命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不用去依赖其 ...
- 设计模式--命令模式(Command)
基本概念: Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了. 命令模式的 ...
- javascript设计模式——命令模式
前面的话 假设有一个快餐店,而我是该餐厅的点餐服务员,那么我一天的工作应该是这样的:当某位客人点餐或者打来订餐电话后,我会把他的需求都写在清单上,然后交给厨房,客人不用关心是哪些厨师帮他炒菜.餐厅还可 ...
- C++设计模式——命令模式
什么是命令模式? 在GOF的<设计模式:可复用面向对象软件的基础>一书中对命令模式是这样说的:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以 ...
- 浅谈js设计模式 — 命令模式
命令模式最常见的应用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦 ...
随机推荐
- PAT 1084 Broken Keyboard[比较]
1084 Broken Keyboard (20 分) On a broken keyboard, some of the keys are worn out. So when you type so ...
- AlphaControls的使用方法
AlphaControls的使用方法 转载▼ 一.安装方法: 1.解压缩下载的文件,并把它放到你希望的位置,例如 D:\Coder\ 2.在Delphi的菜单:Tools->Envir ...
- vue跳转页面传值怎么传?
这是路由跳转: this.$router.push( { name: 'holderResult', params: { meetingId:self.$route.params.meetingId} ...
- SCP命令只能单项拷贝,另一个方向“RSA host key for 172.16.103.176 has changed and you have requested strict checki Host key verification failed. lost connection”问题
[dinghuaneng@95 move_data]$ scp * dinghuaneng@172.16.103.176:/home/dinghuaneng@@@@@@@@@@@@@@@@@@@@@@ ...
- spark[源码]-DAG调度器源码分析[二]
前言 根据图片上的结构划分我们不难发现当rdd触发action操作之后,会调用SparkContext的runJob方法,最后调用的DAGScheduler.handleJobSubmitted方法完 ...
- 前端隐藏Ios及安卓滚动条
1.方法不通用 // .scroll_list::-webkit-scrollbar { display:none } .scroll_list::-webkit-scrollbar-track { ...
- [Deep Learning]学习资料积累
1. ufldl教程√ Andrew Ng的教程,matlab代码. 2. Neural Network and Deep Learning√: 一本未写完的书,非常细致,对基础的概念比如cross ...
- make menuconfig错误的解决办法
如果使用make menuconfig的方式配置内核,又碰巧系统没有安装ncurses库(ubuntu系统默认就没有安装此库),就会出现错误,错误信息大体上如下: *** Unable to find ...
- IDEA 逆向工程
今天要写一个导入功能,需要把数据库的一个表映射成一个pojo,但是这表字段不是一般的多啊...想了想能不能自动生成???在IDEA中点了半天发现还是可以的 下面介绍一下步骤: 第一步:找到这个图标,建 ...
- Package Manager Console的使用
Find-Package PM> Find-Package autofac https://docs.microsoft.com/en-us/nuget/tools/ps-ref-find-pa ...