[设计模式] 14 命令模式 Command
2024-10-16 18:06:04
Command 模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到
具体的 ConcreteCommand 类中(Receiver)中,从而实现调用操作的对象和操作的具体实现
者之间的解耦。
在GOF的《设计模式:可复用面向对象软件的基础》一书中对命令模式是这样说的:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。在OOP中,一切都是对象,将请求封装成对象,符合OOP的设计思想,当将客户的单个请求封装成对象以后,我们就可以对这个请求存储更多的信息,使请求拥有更多的能力;命令模式同样能够把请求发送者和接收者解耦,使得命令发送者不用去关心请求将以何种方式被处理。
UML类图
Command:声明执行操作的接口;
ConcreteCommand:将一个接收者对象绑定于一个动作,之后,调用接收者相应的操作,以实现Execute来完成相应的命令;
Client:创建一个具体命令对象,但是并没有设定它的接收者;
Invoker:要求该命令执行这个请求;
Receiver:知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者。
以上这些对象是按照下面的方式进行协作的:
- Client创建一个ConcreteCommand命令对象,并指定它的Receiver对象;
- Invoker对象存储该ConcreteCommand对象;
- 该Invoker通过调用Command对象的Execute操作来提交一个请求。如果这个命令请求是可以撤销的,ConcreteCommand就执行Execute操作之前存储当前状态以用于取消该命令请求;
- ConcreteCommand对象调用Receiver的一些操作以执行该请求。
#include <iostream>
using namespace std; #define SAFE_DELETE(p) if (p) { delete p; p = NULL; } class Receiver
{
public:
void Action()
{
cout<<"Receiver->Action"<<endl;
}
}; class Command
{
public:
virtual void Execute() = ;
}; class ConcreteCommand : public Command
{
public:
ConcreteCommand(Receiver *pReceiver) : m_pReceiver(pReceiver){}
void Execute()
{
m_pReceiver->Action();
}
private:
Receiver *m_pReceiver;
}; class Invoker
{
public:
Invoker(Command *pCommand) : m_pCommand(pCommand){}
void Invoke()
{
m_pCommand->Execute();
}
private:
Command *m_pCommand;
}; int main()
{
Receiver *pReceiver = new Receiver();
Command *pCommand = new ConcreteCommand(pReceiver);
Invoker *pInvoker = new Invoker(pCommand);
pInvoker->Invoke();
SAFE_DELETE(pInvoker);
SAFE_DELETE(pCommand);
SAFE_DELETE(pReceiver);
return ;
}
最新文章
- How To Join XLA_AE_HEADERS and RCV_TRANSACTIONS? [ID 558514.1]
- mysql多种备份方式比较及实现
- .Net Core+cenos7+Docker+Dockerfile 部署实践
- Excel计算一列的和sum(A:A)
- MSP430之ADC采集滤波
- easyui datagrid 多表头设置
- ExecutorService.execute(Runnable x) 判断是否完成,得到返回值
- 关于Comparator和Comparable
- linux之let用法
- UVALive 7077 Little Zu Chongzhi&#39;s Triangles (有序序列和三角形的关系)
- Myeclipse8.5开发-安装一:Myeclipse8.5注册码生成程序
- Vb.net MakeLong MAKELPARAM 合并整数代码
- 初步了解Bootstrap4
- LAB8 android
- Kubernetes1.91(K8s)安装部署过程(二)--证书kubeconfig文件创建
- Linux awk工具简单学习记录
- SpringMVC系列(八)国际化
- 数据库主键ID生成策略
- jenkins+jacoco+ant自动化代码和应用服务代码分离场景获取远程服务的覆盖率
- Java9 modules (Jigsaw)模块化迁移