C++ 设计模式之命令模式

C++ 设计模式之命令模式

简介

1、命令模式 (Command)是一种行为型设计模式,它将一个请求封装为一个对象,从而使您可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

2、命令模式 (Command)应用场景包括但不限于:
2.1、需要将请求调用者和请求接收者解耦时。
2.2、需要支持撤销(Undo)和重做(Redo)操作时。
2.3、当系统需要支持命令的排队执行和历史记录功能时。
2.4、当系统需要组合命令,形成宏命令时。

3、命令模式 (Command)的构成
3.1、命令接口

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

3.2、具体命令

class Light
{
public:
	void on();
	void off();
};

3.3、命令执行对象

class LightOnCommand : public Command
{
public:
	LightOnCommand(Light& li);
	void execute();
private:
	Light& light;
};

4、命令模式 (Command)的优点
4.1、解耦:调用方(客户端)和接收方(接收器)之间没有直接关系,双方只通过命令对象进行通信,更易于维护和扩展。
4.2、扩展性:新增命令或者改变命令的实现不会影响现有的其他类,符合开闭原则。
4.3、组合命令:可以将多个简单命令组合成一个复合命令(宏命令),方便执行多个操作。
4.4、支持撤销/重做:命令通常可以做到“可撤销”,容易实现操作的撤销和重做。
4.5、更好的控制:可以对命令进行排队和记录,以及在无需知道命令具体实现的情况下进行其他操作。

5、命令模式 (Command)的缺点
5.1、类膨胀:每个单独的命令都需要一个新的类进行包装,当命令多时类的数量会急剧增加。
5.2、复杂度增加:设计和实现更加复杂,特别是需要维护历史状态和相关状态回滚时。

简单示例

1、定义

// 命令接口
class Command
{
public:
	virtual ~Command() {};
	virtual void execute() = 0;
};

// 具体命令
class Light
{
public:
	void on();
	void off();
};

class LightOnCommand : public Command
{
public:
	LightOnCommand(Light& li);
	void execute();
private:
	Light& light;
};

class LightOffCommand : public Command
{
public:
	LightOffCommand(Light& li);
	void execute();
private:
	Light& light;
};

// 调用者
class SimpleRemoteControl
{
public:
	SimpleRemoteControl();
	void setCommand(Command* commend);
	void buttonWasPressed();

private:
	Command* solt;
};

2、实现

void Light::on()
{
	std::cout << "Light is on" << std::endl;
}

void Light::off()
{
	std::cout << "Light is off" << std::endl;
}

LightOnCommand::LightOnCommand(Light& li) : light(li)
{

}

void LightOnCommand::execute()
{
	light.on();
}

LightOffCommand::LightOffCommand(Light& li) : light(li)
{

}

void LightOffCommand::execute()
{
	light.off();
}

SimpleRemoteControl::SimpleRemoteControl() : solt(nullptr)
{

}

void SimpleRemoteControl::setCommand(Command* commend)
{
	solt = commend;
}

void SimpleRemoteControl::buttonWasPressed()
{
	if (solt)
	{
		solt->execute();
	}
}

3、调用

SimpleRemoteControl si;
Light li;
LightOnCommand lightOn(li);
LightOffCommand lightOff(li);

si.setCommand(&lightOn);
si.buttonWasPressed();

si.setCommand(&lightOff);
si.buttonWasPressed();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/760221.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS AddIn插件】【可用于全国水旱灾害风险普查】全网最强洪水淹没分析插件-基于8邻域种子搜索算法-有源淹没分析算法

最近有很多GIS小伙伴咨询我关于基于8邻域种子搜索算法的有源淹没分析插件的使用方法及原理&#xff0c;咱们通过这篇文章给大家详细介绍下这款插件的运行机制。 一、插件类型及适用版本 本插件属于ArcGIS AddIn工具条插件&#xff0c;基于ArcGIS Engine10.2.2的开发环境开发的&…

Nature:使用语义熵检测大语言模型中的幻觉

使用语义熵检测大语言模型中的幻觉 Detecting hallucinations in large language models using semantic entropy 论文阅读摘要研究目标论文图表概述总结关键解决方案语义熵计算:虚构内容检测: 双向蕴涵在大语言模型中的应用上下文的重要性蕴涵估计器 实验设计语义熵计算步骤结…

Firewalld防火墙基础

Firewalld 支持网络区域所定义的网络连接以及接口安全等级的动态防火墙管理工具 支持IPv4、IPv6防火墙设置以及以太网桥 支持服务或应用程序直接添加防火墙规则接口 拥有两种配置模式 运行时配置&#xff1a;临时生效&#xff0c;一旦重启或者重载即不生效 永久配置&#xff1a…

【简易版tinySTL】 红黑树- 定义, 插入, 构建

文章目录 旋转左旋右旋 左旋右旋代码实现红黑树的基本性质红黑树的插入红黑树的插入示例红黑树修复代码实现参考资料 旋转 对于一个平衡二叉搜索树&#xff0c;左子树高度为4&#xff0c;右子树高度为2&#xff0c;它们的高度差为2&#xff0c;破坏了平衡性&#xff08;高度差&…

IT之家最新科技热点

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

前端:Nuxt2 + Vuetify2

想要开发一个网站&#xff0c;并且支持SEO搜索&#xff0c;当然离不开我们的 Nuxt &#xff0c;那通过本篇文章让我们一起了解一下。如果构建一个Nuxt项目 安装 Nuxt&#xff0c;创建项目 安装nuxt2&#xff0c; 需要node v16&#xff0c;大家记得查看自己的node版本。构建脚…

初阶数据结构之堆讲解

本篇文章带大家学习的是堆&#xff0c;还请各位观众老爷给个三连 正片开始 堆的概念 如果有一个关键码的集合 K { &#xff0c; &#xff0c; &#xff0c; … &#xff0c; } &#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;并满…

J021_QQ号格式校验

一、需求描述 校验QQ号码是否正确。要求全部是数字&#xff0c;数字长度&#xff08;6-20位之间&#xff09;&#xff0c;不能以0开头。 二、代码实现 package com.itheima.sort;public class Test {public static void main(String[] args) {System.out.println("----…

MySQL4(事务、函数、慢查询和索引)

目录 一、MySQL事务 1. 概念 2. 事务的ACID原则 3. MySQL实现事务的方法 4. MySQL实现事务的步骤 5. 事务的原子性、一致性、持久性 6. 事务的隔离性 7. MySql中的锁 1. 共享锁 2. 排他锁 3. 行级锁 4. 表级锁 5. 间隙锁 6. 临键锁 7. 记录锁 8. 意向共享锁…

1.spring入门案例

Spring 介绍 Spring是轻量级的开源的JavaEE框架。 Spring有两个核心部分&#xff1a;IOC和AOP IOC 控制反转&#xff0c;把创建对象过程交给Spring进行管理。 AOP 面向切面&#xff0c;不修改源代码进行功能增强。 Spring特点 1.方便解耦&#xff0c;简化开发。 2.AOP编…

docker安装sqlserver2019

1、背景 由于要学习flink cdc&#xff0c;并且数据源是sqlserver&#xff0c;所以这里采用docker安装sqlserver。 2、安装步骤 &#xff08;1&#xff09;建目录 // 创建指定的目录 mkdir sqlserver// 进入该目录 cd sqlserver// 创建/data/mssql目录 mkdir -p /data/mssql…

SpringBoot + mkcert ,解决本地及局域网(内网)HTTPS访问

本文主要解决访问SpringBoot开发的Web程序,本地及内网系统,需要HTTPS证书的问题。 我测试的版本是,其他版本不确定是否也正常,测试过没问题的小伙伴,可以在评论区将测试过的版本号留下,方便他人参考: <spring-boot.version>2.3.12.RELEASE</spring-boot.vers…

Ubuntu20.04安装vimplus插件

参考文章&#xff1a; Ubuntu Linux下vimplus的安装及使用安装vimplus之后乱码问题解决 1、安装步骤&#xff1a; $ git clone https://github.com/chxuan/vimplus.git ~/.vimplus$ cd ~/.vimplus$ ./install.sh2、./install.sh 过程 出现选择是否备份 /home/yin-roc/.vim…

注意力机制之ECA-Net:Efficient Channel Attention for Deep Convolutional Neural Network

论文link&#xff1a;link code&#xff1a;code 1.摘要 近年来&#xff0c;通道注意机制被证明在改善深层卷积神经网络&#xff08;CNN&#xff09;的性能方面提供了巨大的潜力。然而现有的大多数方法都致力于开发更复杂的注意模块以获得更好的性能&#xff0c;这不可避免地增…

博客都在使用的打字机效果,居然这么简单?

效果展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>body …

历年各省废水污染、治理数据

1996-2019年各省废水污染、治理数据https://download.csdn.net/download/a519573917/89485042 目录 摘要&#xff1a; 一、引言 二、文献综述 三、实证模型 &#xff08;一&#xff09;变量选择 &#xff08;二&#xff09;数据来源 &#xff08;三&#xff09;模型设定…

timm中模型更换huggingface模型链接

现在timm默认使用huggingface的链接了&#xff0c;错误链接如下&#xff1a; (MaxRetryError("HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /timm/swinv2_tiny_window8_256.ms_in1k/resolve/main/model.safetensors (Caused by C…

适用于智慧城市、智慧文旅等在线场景的轻量级3D数字人引擎MyAvatar简介

本人研发的国内首个纯面向web应用和小程序的轻量级3D虚拟人引擎MyAvatar。 功能简述 支持3D模型定制&#xff08;写实或卡通风格均可&#xff0c;人物模型需实现绑定和变形&#xff09;动画可以内置于模型中&#xff0c;也可以单独以glb或fbx格式导出并动态加载支持readyplay…

音频接口电路的PCB设计

Audio接口是音频插孔&#xff0c;即音频接口&#xff0c;可分为Audio in接口和Audio out接口。音频接口是连接麦克风和其他声源与计算机的设备&#xff0c;其在模拟和数字信号之间起到了桥梁连接的作用。对于平台的数字音频接RK3588口&#xff0c;需遵循《Rockchip RK3588 High…

时序分析之Clock rise/fall edge边沿对选取解析

目录 一、前言 二、Clock edge的选取逻辑 2.1 设计工程 2.2 同频同相 2.3 同频不同相1 2.4 同频不同相2 2.5 倍频关系(Fclk1>Fclk2) 2.6 倍频关系(Fclk1)<> 2.7 倍频关系存在相移(Fclk1)<> 2.8 非倍频关系无相移(Fclk1)<> 2.9 非倍频关系有相移…