当前位置: 首页 > news >正文

设计模式14、命令模式 Command

解释说明:命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传递给调用对象。调用对象寻找可以处理该命令的合适对象,并把该命令传给相应的对象,该对象执行命令。

命令抽象类(Command):定义命令的接口,声明执行的方法。

具体命令(ConcreteCommand):命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

实现者/接收者(Receiver):接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

调用者/请求者(Invoker):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

command.h
#pragma once
class Command
{
public://每个命令类都必须有一个执行命令的方法virtual void execute() = 0;
};
receiver.h
#pragma once
class Receiver
{
public://抽象接收者, 定义每个接收者都必须完成的业务virtual ~Receiver() { }virtual void doSomething() = 0;
};
concreteCommand.h
#pragma once
#include "command.h"
#include "receiver.h"
#include <iostream>
class ConcreteCommand1 :public Command
{
private:Receiver* m_pReceiver;//哪个Receiver类进行命令处理
public://构造函数传递接收者ConcreteCommand1(Receiver* receiver){m_pReceiver = receiver;}//必须实现一个命令void execute(){//业务处理std::cout << "command1 run" << std::endl;m_pReceiver->doSomething();}
};
class ConcreteCommand2 : public Command
{
private:Receiver* m_pReceiver;
public:ConcreteCommand2(Receiver* receiver){m_pReceiver = receiver;}void execute(){std::cout << "command2 run" << std::endl;m_pReceiver->doSomething();}
};
concreteReciver.h
#pragma once
#include "receiver.h"
#include <iostream>
class ConcreteReciver1 : public Receiver
{//每个接收者都必须处理一定的业务逻辑
public:void doSomething(){std::cout << "Reciver1 doing" << std::endl;}
};
class ConcreteReciver2 : public Receiver
{//每个接收者都必须处理一定的业务逻辑
public:void doSomething(){std::cout << "Reciver2 doing" << std::endl;}
};
invoker.h
#pragma once
#include "command.h"
#include <iostream>
class Invoker
{
private:Command* m_pCommand;
public://接受命令void setCommand(Command* command){m_pCommand = command;std::cout << "invoker add command" << std::endl;}//执行命令void action(){m_pCommand->execute();std::cout << "invoker action command" << std::endl;}
};
main.cpp
#include "concreteCommand.h"
#include "concreteReciver.h"
#include "invoker.h"
int main()
{//首先声明调用者InvokerInvoker* invoker = new Invoker();//定义接收者Receiver* receiver = new ConcreteReciver1();Receiver* receiver2 = new ConcreteReciver2();//定义一个发送给接收者的命令Command* command = new ConcreteCommand1(receiver);Command* command2 = new ConcreteCommand2(receiver);Command* command3 = new ConcreteCommand1(receiver2);Command* command4 = new ConcreteCommand2(receiver2);//把命令交给调用者去执行invoker->setCommand(command);invoker->action();invoker->setCommand(command2);invoker->action();invoker->setCommand(command3);invoker->action();invoker->setCommand(command4);invoker->action();system("pause");return 0;
}

http://www.lryc.cn/news/184901.html

相关文章:

  • 【Go】excelize库实现excel导入导出封装(一),自定义导出样式、隔行背景色、自适应行高、动态导出指定列、动态更改表头
  • 【开发篇】二十、SpringBoot整合RocketMQ
  • OpenCV实现求解单目相机位姿
  • 深入解析PostgreSQL:命令和语法详解及使用指南
  • Elasticsearch数据搜索原理
  • vue模版语法-{{}}/v-text/v-html/v-once
  • 前端埋点上传
  • 第11章 Redis(一)
  • freertos信号量之二值信号量
  • notepad++ 如何去除换行
  • PPT NO.2 ​插入透明校徽
  • Linux系统部署PostgreSQL 单机数据库
  • 好用的办公摸鱼神器
  • 手写Java序列化工具
  • mysql面试题26:MySQL中什么是MVCC,它的底层原理是什么
  • SQL进阶 - SQL的编程规范
  • [NISACTF 2022]babyserialize - 反序列化+waf绕过【*】
  • docker部署Vaultwarden密码共享管理系统
  • 低代码开发技术选型
  • 在vue2中,v-model和.sync的区别
  • nginx 配置
  • 【计算机视觉|人脸建模】学习从图像中回归3D面部形状和表情而无需3D监督
  • Linux系统之部署h5ai目录列表程序
  • Java-Exception
  • C++并发与多线程(2) | 线程运行开始和结束的基本方式
  • vue3前端开发-flex布局篇
  • 网络是什么?(网络零基础入门篇)
  • 【JavaEE】线程安全的集合类
  • 【C++算法】is_partitioned、partition_copy和partition_point
  • MyBatis(JavaEE进阶系列4)