Commond:命令模式

2023-11-02

命令模式即将请求封装为对象Commond

执行者可以执行多个操作,即执行者才是操作真正的实现者。设其为操作0-9。每个操作都封装了一个对应的Commond类。当该Commond被调用时,Commond会令执行者执行其对应的操作

用户需要执行者执行某个操作序列。比如这个序列为06131109,共8个操作。那么用户创建8个Commond对象,然后将这8Commond对象依次交给一个调用者Invoker,该调用者Invoker会依次调用Commond。从而这8个Commond对象会顺次执行。即调用者Invoker负责接收命令并调用命令的执行函数

实际上,8个Commond对象,其中有重复的Commond。由于Commond仅仅负责请求,而并非具体执行,故同种Commond只用创建一个对象即可。当将Commond提交给调用者Invoker时,提交Commond的指针即可。

因此,每个Commond都可以进行记录。可以对Commond进行重做,也可以进行撤销(撤销需要执行者有对应的撤销函数)。还可以设置一个标志位,当命令序列进行执行时,一旦某个命令的标志位为不执行,那么可以跳过该命令,直接执行下一条命令。

对于一个Commond序列,由于可以记录,所以只要原始输入相同,那么就可以再现整个执行过程。

1.    定义命令基类

命令基类定义了命令的执行接口Execute()。所有命令都继承该标准接口。

class Command
{
public:
	virtual void Execute() = 0;
};

2.    定义接收者

接收者负责最终行为的执行,即真正的执行者。

注意执行具体行为并不是由命令负责,而是接收者负责。也就是说,命令只是一种通知手段,告知接收者要做什么。至于怎么做,是接收者负责的

因此,接收者的Action()函数才是真正的功能实现函数。

考虑到命令有多条,所以可以在同一个Receiver中定义多个Action()函数,以对应每一条命令;或者基于Receiver派生,对于每一条命令,都定义一个对应的Receiver

class Receiver
{
public:
	void Action() {};
};

3.    定义具体命令

具体命令从Command类派生。

每个具体命令都要指定一个接收者,以执行该命令对应的功能。在该命令的Execute()接口函数中,会令接收者执行某个指定的函数。这样就实现了命令对应功能的执行。

class ConcreteCommand : public Command
{
public:
	ConcreteCommand(Receiver* pReceiver)
	{
		this->_recv = pReceiver;
	};

	virtual void Execute()
	{
		this->_recv->Action();
	};
private:
	Receiver* _recv;
};

4.    定义调用者

调用者用于接收命令,并调用命令的执行函数,从而进一步使得命令调用接收者的Action()函数来实现功能。

class Invoker
{
public:
	Invoker(Command* pCommand)
	{
		this->_cmd = pCommand;
	};
	void Invoke()
	{
		this->_cmd->Execute();
	};
private:
	Command* _cmd;
};

5.    用户使用

对于用户而言,需要创建命令,并将命令与其接收者进行绑定。

然后通过调用者Invoker来对命令进行调用,从而间接调用了ReceiverAction()函数。

void main()
{
	//创建具体命令对象pCmd,并设定它的接收者pRev
	Receiver*	pRev	= new Receiver();
	Command*	pCmd	= new ConcreteCommand(pRev);
	//将命令提交给调用者,并由调用者进行调用
	Invoker* pInv = new Invoker(pCmd);
	pInv->Invoke();
}

 

整个过程为:

用户创建命令,并设定其接收者

→用户将命令提交给调用者

→用户调用调用者的Invoke()函数

→调用者的Invoke()函数调用命令的Execute()函数

→命令的Execute()函数调用接收者的Action()函数

→操作得到执行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Commond:命令模式 的相关文章

随机推荐

  • redis知识点总结对比

    1 redis特性 1 是一个速度非常快的非关系型数据库 2 可以存储key与5种不同类型值的映射关系 3 可以将键值数据持久化到硬盘中 4 可以使用复制特性扩展读性能 5 可以使用分片来扩展写性能 2 redis和其他产品的对比 3 re
  • NIST数字测试套件使用说明

    NIST 测试套件是由15个测试组成的统计软件包 这些是为了测试随机 任意长度 由基于硬件或软件的密码随机或伪随机数生成器产生的二进制序列 测试关注于各种不同类型的已存在的非随机序列 有些测试可以分成各种子测试 15个测试主要是 属于密码算
  • Vue中组件和插件有什么区别?

    一 组件是什么 组件就是把图形 非图形的各种逻辑均抽象为一个统一的概念 组件 来实现开发的模式 在Vue中每一个 vue文件都可以视为一个组件 组件的优势 降低整个系统的耦合度 在保持接口不变的情况下 我们可以替换不同的组件快速完成需求 例
  • 大数据学习——Zookeeper集群搭建

    一 Zookeeper入门 1 概述 Zookeeper是一个开源的分布式的 为分布式框架提供协调服务的Apache项目 2 特点 1 Zookeeper 一个领导者 Leader 多个跟随者 Follower 组成的集群 2 集群中只要有
  • typescript开发electron程序的环境搭建过程

    1 安装nodejs 2 安装vs2013 或者vs2015 下载对应的typescript插件 3 创建项目 4 npm install g tsd 5 tsd install react global save tsd install
  • 模拟双色球系统-判断中奖情况

    package Java project 1 import java util Random import java util Scanner public class Java project 1 public static void m
  • argparser中的参数解释以及required参数在pycharm中的运行方式

    在argparser包时 其中add argumenet 函数有很多参数 name or flags 一个命名或者一个选项字符串的列表 例如 foo 或 f foo action 当参数在命令行中出现时使用的动作基本类型 nargs 命令行
  • Python 入门之控制结构 - 顺序与选择结构——第1关:顺序结构

    Python 入门之控制结构 顺序与选择结构 第1关 顺序结构 任务描述 程序最基本的结构就是顺序结构 顺序结构就是程序按照语句顺序 从上到下依次执行各条语句 本关要求学习者理解顺序结构 并对输入的三个数changeone changetw
  • 智能家居 (6) ——语音识别线程控制

    目录 语音识别线程控制代码 inputCommand h mainPro c voiceControl c 代码测试 往期文章 语音识别线程控制代码 inputCommand h include
  • fwrite函数的用法

    fwrite函数就是写文件的函数 它的函数原型如下 fwrite const void buffer size t size size t count FILE stream 可以看到这个函数的参数有四个 buffer 数据存储的地址 si
  • 点云高度归一化处理(附 python 代码)

    gt 由于不同地物之间存在着高程的差异 为了去除地形起伏对点云数据高程值的影响 所以需要根据提取出的地面点进行点云归一化处理 这一步是很多算法的基础 可以提高后续点云分类或分割的准确度等 如下图所示 gt 归一化的过程其实相对简单 遍历每一
  • 贪心算法力扣刷题练习(含思路与题解)

    贪心算法 保证每次操作都是局部最优 使得最终结果也是全局最优的 需要找到贪心的策略 使得每次的最优能保证全局最优 通常需要排序 根据排序需求 自定义比较函数 sort a begin a end vector
  • protobuf c++编程笔记

    文章目录 字段内容的定义 修饰符 字段类型 引用方式 不同字段的方法 1 optional修饰的基本类型 2 optional修饰的对象类型 3 repeated修饰的基本类型 4 repeated修饰的对象类型 序列化 反序列化 字段内容
  • Vue + 高德地图 + 三维模型

    一 创建高德的kek和密钥 根据需求选择服务平台 我选择的是web端 JS API 二 在vue中引入高德地图 在public文件下找到index html文件引入你的key值 参考 https lbs amap com demo jsap
  • Could not resolve com.android.tools.build:gradle:4.0.0.

    打开别人发过来的项目的时候gradle一直下载不下来 然后报错 尝试了很多办法 最后在用户变量种添加 Android SDK ROOT 自己的Android SDK路径 gradle 下载成功 可能遇到的具体错误问题不一样仅供参考
  • CentOS8基础篇15:防火墙命令配置

    一 防火墙服务 1 启动 关闭 重启防火墙服务 systemctl start firewalld service systemctl stop firewalld service systemctl restart firewalld s
  • ES 查询不稳定现象及解决方案

    问题描述 对于相同的查询语句 ES 查询返回不同的检索内容 示例 1 filter match content 宝骏510 order score size 10 在上面的示例中可以看到推荐句子的第二句和第三句的顺序发生了变化 产生原因 官
  • spring事务的隔离级别。如何避免脏读或者幻读

    事务隔离级别为四个等级 默认是数据库的隔离级别 需要去数据库查询一下隔离级别 1 查看当前会话隔离级别 select tx isolation 2 查看系统当前隔离级别 select global tx isolation 隔离级别 Iso
  • unity MeshCollider组件

    在应用MeshCollider组件中的一个属性 Convex 这个功能很好用 但是他也是有一个坑在里面 他的好处 当你点击之后他会自动根据模型自动生成一个碰撞器 这个是不规则的碰撞器 他的坏处 没有点击 Convex 时候 比如当你有一个物
  • Commond:命令模式

    命令模式即将请求封装为对象Commond 执行者可以执行多个操作 即执行者才是操作真正的实现者 设其为操作0 9 每个操作都封装了一个对应的Commond类 当该Commond被调用时 Commond会令执行者执行其对应的操作 用户需要执行