设计模式(4)--对象行为(2)--命令

news2025/1/23 3:22:23
1. 意图

    将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请

    求日志,以及支持可撤销的操作。

2. 四种角色

    接收者(Receiver)、抽象命令(Command)、具体命令(Concrete Command)、请求者(Invoker)

3. 优点

   3.1 将调用方(请求者)和操作方(接收者)解耦。

   3.2 命令对象可以被操纵和扩展。

   3.3 可以将多个命令装配成一个复合命令。

   3.4 容易增加新的命令,无需改变已有的类。 

4. 缺点

    N/A

5. 相关模式

    5.1 组合模式可被用来实现宏命令。

    5.2 Memento模式可用来保持某个状态,命令用这一状态来撤消。

    5.3 允许被拷贝的命令用原型模式。

6. 代码示意(C++)
#pragma once
#include <iostream>
#include <vector>

using namespace std;

class Receiver
{
public:
	void Action1() {
		cout << "西红柿炒鸡蛋已完成" << endl;
	}
	void Action2() {
		cout << "凉瓜牛肉已完成" << endl;
	}
};
class Command
{
protected:
	Receiver* m_pReceiver;//命令接收者
public:
	Command(Receiver* pReceiver) {
		m_pReceiver = pReceiver;
	}
	virtual void Execute() = 0;
};

class ConcreteCommand1 :public Command
{
public:
	ConcreteCommand1(Receiver* pReceiver) :Command(pReceiver){

	}
	virtual void Execute() {
		m_pReceiver->Action1();
	}
};

class ConcreteCommand2 :public Command
{
public:
	ConcreteCommand2(Receiver* pReceiver) :Command(pReceiver){

	}
	virtual void Execute() {
		m_pReceiver->Action2();
	}
};

class Invoker
{
	vector<Command*> m_commandList;
public:
	~Invoker() {
		auto it = m_commandList.begin();
		while (it != m_commandList.end()) {
			delete* it;
			++it;
		}
		m_commandList.clear();
	}
	void AddCmd(Command* pCommand)
	{
		m_commandList.emplace_back(pCommand);
		cout << "增加命令" << endl;
	}

	//通知执行
	void Notify()
	{
		auto it = m_commandList.begin();
		while (it != m_commandList.end())
		{
			(*it)->Execute();
			++it;
		}
	}
};
#include "Command.h"
int main() {
	Receiver* pReceiver = new Receiver();

	Invoker *pInvoker = new Invoker();
	pInvoker->AddCmd(new ConcreteCommand1(pReceiver));
	pInvoker->AddCmd(new ConcreteCommand2(pReceiver));

	pInvoker->Notify();

	delete pInvoker;
	delete pReceiver;
	return 0;
}

运行结果:

 

6.1 请求者和接收者不直接打交道,而是通过命令对象(3.1)。

6.2 增加新命令ConcreteCommand3,不需要修改其它类(3.4)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP_滑动窗口介绍

简介 TCP协议中有两个窗口&#xff0c;滑动窗口和拥塞窗口&#xff0c;两者均是一种流控机制&#xff1b;滑动窗口是接收方的流控机制&#xff0c;拥塞窗口是发送方的流控机制。 本文介绍滑动窗口&#xff0c;接收方为TCP连接设置了接收缓存。当TCP连接接收到正确、按序的字节…

idea运行tocmat报错

1.检查环境变量是否配置正确。 网上有许多配置tomcat环境变量的方法&#xff0c;这里不再赘述。 2.判断是否有该情况&#xff1a; 在tomcat的bin目录下有三个bat文件(startup.bat,shutdown.bat,catalina.bat)&#xff0c;随意双击一个&#xff0c;会报出上述错误。但是右键使…

JavaScript高级 函数进阶篇

函数进阶 1、函数的定义和调用 函数声明方式function关键字&#xff08;命名函数&#xff09;&#xff1b;函数表达式&#xff08;匿名函数&#xff09;&#xff1b;new Function()&#xff08;此处的Function()是一个构造函数&#xff09;&#xff1b;var fn new Function(参…

华为鸿蒙(HarmonyOS):连接一切,智慧无限

华为鸿蒙是一款全场景、分布式操作系统&#xff0c;旨在构建一个真正统一的硬件生态系统。该操作系统于2019年8月首次发布&#xff0c;并被设计为可以应用于各种设备&#xff0c;包括智能手机、智能手表、智能电视、车载系统等多种智能设备。 推荐一套最新版的鸿蒙4.0开发教程 …

【即插即用篇】YOLOv8改进实战 | 引入 Involution(内卷),用于视觉识别的新一代神经网络!涨点神器!

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8是一种尖端的、最先进的 (SOTA) 模型,它建立在以前成…

antdv中的slider组件会默认将min值传递给value

如果是使用响应式变量&#xff0c;会将min的值传递到v-model对应的变量里

with torch.no_grad()在Pytorch中的应用

with torch.no_grad()在Pytorch中的应用 参考&#xff1a; https://blog.csdn.net/qq_24761287/article/details/129773333 https://blog.csdn.net/sazass/article/details/116668755 在学习Pytorch时&#xff0c;老遇到 with torch.no_grad()&#xff0c;搞不清其作用&#…

Deployment Controller详解(下)

上一篇在《Deployment Controller详解&#xff08;上&#xff09;》中介绍了Deployment Controller 的创建、更新和回滚。了解了这三个功能&#xff0c;基本上也就懂得了大厂PaaS平台中服务的灰度升级、失败回滚等操作是如何实现的了。 接下来本文会介绍Deployment Controller…

在Windows11下安装完Ubuntu20.04双系统后配置环境的过程

1.NVIDIA驱动检测及安装 1.1 查看显卡信息 # 显示系统中所有通过PCI总线连接的VGA兼容控制器信息。包括集成显卡即与CPU内置在同一块芯片上的显卡&#xff09;以及独立显卡。 lspci | grep VGA # 将显示有关系统中所有NVIDIA显卡的信息。 lspci | grep NVIDIA 解释&#xf…

【数据结构之顺序表】

数据结构学习笔记---002 数据结构之顺序表1、介绍线性表1.1、什么是线性表? 2、什么是顺序表?2.1、概念及结构2.2、顺序表的分类 3、顺序表接口的实现3.1、顺序表动态存储结构的Seqlist.h3.1.1、定义顺序表的动态存储结构3.1.2、声明顺序表各个接口的函数 3.2、顺序表动态存储…

智能优化算法应用:基于野马算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于野马算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于野马算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.野马算法4.实验参数设定5.算法结果6.参考文献7.MA…

国产AI大模型与ChatGPT的差距到底有多大?

据不完全统计&#xff0c;截止今年10月&#xff0c;中国已经发布了238个大模型。IDC预测&#xff0c;2026年中国人工智能软件及应用市场规模将达到211亿美元&#xff0c;人工智能将进入大规模落地应用关键期。 有报告分析发现&#xff0c;中国自2020年进入大模型加速发展期&am…

GPTs 官方榜单 Top10,第一个独属于中国传统文化的胜利

GPTs 发布已经快两个月了&#xff0c;很有可能成为下一阶段的 app 形态&#xff0c;现在已经有很多人在开发、使用 GPTs&#xff0c;最近官方数据也更新了使用量最多的 GPT&#xff0c;来看下中文榜单的 Top10&#xff1a; 排名标题创建者使用量1AI 算命Jerrold Bergnaum12100…

【智能家电】东胜物联离在线语音方案为厨电企业赋能,实现厨房智能化控制

近年来&#xff0c;我国厨电市场蓬勃发展。据行业统计数据显示&#xff0c;至今年6月&#xff0c;市场规模已达356亿元&#xff0c;同比增长8.8%。随着数字科技、物联网和人工智能的兴起&#xff0c;厨电产品正在朝着更智能、多功能化的方向迅速发展。 为此厨电厂商正在积极布…

开放原子线下训练营---STM32H7搭载TobudOS开发心得

导语&#xff1a; 本次线下活动是以STM32H7为核心的一个功能强大的开发板&#xff0c;不仅支持Audio&#xff0c;HDMI&#xff0c;还支持4G或者WiFi模块&#xff0c;也可以外接屏幕&#xff0c;本次线下训练营是以4G模块进行开发。 线下的实物开发板如下所示&#xff1a; 注意…

算法练习Day19 (Leetcode/Python-二叉树)

108. Convert Sorted Array to Binary Search Tree Given an integer array nums where the elements are sorted in ascending order, convert it to a height-balanced binary search tree. 思路&#xff1a; 一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的…

微软官方镜像下载大全(windows iso 官方镜像)

原本只是想下一个Windows Server 2022中文版的镜像&#xff0c;后面发现要么就是慢得一批的某盘&#xff0c;要么就是磁力&#xff0c;我想直接下载简简单单&#xff0c;找了一圈没有找到。官网下载需要注册、登录乱七八糟&#xff0c;最终终于找到下载方法了&#xff0c;适用于…

Linux系统LVS+Keepalived群集

目录 一、概述 &#xff08;一&#xff09;群集特性 1.负载均衡 2.健康检查&#xff08;探针&#xff09; 3.故障转移 &#xff08;二&#xff09;Keepalived 1.作用 &#xff08;1&#xff09;支持故障自动转移 &#xff08;2&#xff09;支持节点健康状态检…

《软件方法(下)》8.2.4 类和属性的命名

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.2 建模步骤C-1 识别类和属性 8.2.4 类和属性的命名 8.2.4.2 关于DDD话语中的“通用语言” DDD&#xff08;领域驱动设计&#xff09;话语中有“通用语言&#xff08;Ubiquitous L…

浅谈Redis分布式锁(上)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 不论面试还是实际工作中…