当前位置: 首页 > 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;
}

相关文章:

设计模式14、命令模式 Command

解释说明&#xff1a;命令模式&#xff08;Command Pattern&#xff09;是一种数据驱动的设计模式&#xff0c;它属于行为型模式。请求以命令的形式包裹在对象中&#xff0c;并传递给调用对象。调用对象寻找可以处理该命令的合适对象&#xff0c;并把该命令传给相应的对象&…...

【Go】excelize库实现excel导入导出封装(一),自定义导出样式、隔行背景色、自适应行高、动态导出指定列、动态更改表头

前言 最近在学go操作excel&#xff0c;毕竟在web开发里&#xff0c;操作excel是非常非常常见的。这里我选择用 excelize 库来实现操作excel。 为了方便和通用&#xff0c;我们需要把导入导出进行封装&#xff0c;这样以后就可以很方便的拿来用&#xff0c;或者进行扩展。 我参…...

【开发篇】二十、SpringBoot整合RocketMQ

文章目录 1、整合2、消息的生产3、消费4、发送异步消息5、补充&#xff1a;安装RocketMQ 1、整合 首先导入起步依赖&#xff0c;RocketMQ的starter不是Spring维护的&#xff0c;这一点从starter的命名可以看出来&#xff08;不是spring-boot-starter-xxx&#xff0c;而是xxx-s…...

OpenCV实现求解单目相机位姿

单目相机通过对极约束来求解相机运动的位姿。参考了ORBSLAM中单目实现的代码&#xff0c;这里用opencv来实现最简单的位姿估计. mLeftImg cv::imread(lImg, cv::IMREAD_GRAYSCALE); mRightImg cv::imread(rImg, cv::IMREAD_GRAYSCALE); cv::Ptr<ORB> OrbLeftExtractor …...

深入解析PostgreSQL:命令和语法详解及使用指南

文章目录 摘要引言基本操作安装与配置连接和退出 数据库操作创建数据库删除数据库切换数据库 表操作创建表删除表插入数据查询数据更新数据删除数据 索引和约束创建索引创建约束 用户管理创建用户授权用户修改用户密码 备份和恢复备份数据库恢复数据库 高级特性结语参考文献 摘…...

Elasticsearch数据搜索原理

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎&#xff0c;设计用于云计算环境中&#xff0c;能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性&#xff0c;可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…...

vue模版语法-{{}}/v-text/v-html/v-once

一、{{}}双括号&#xff1a;用于文本渲染 1、 {{变量名}}:data中返回对象的变量名 2、{{js表达式}}:可以直接进行js表达式处理 3、注意&#xff1a;双大括号中不要写等式书写 二、v-text 指令&#xff0c;用于文本渲染 1、为了解决双大括号渲染数据出现闪烁问题 三、v-cloak …...

前端埋点上传

没事看看&#xff1a; 从用户行为到数据&#xff1a;数据采集全景解析 | 人人都是产品经理 搭建前端监控&#xff0c;采集用户行为的 N 种姿势-前端监控设备 创业公司做数据分析&#xff08;三&#xff09;用户行为数据采集系统-CSDN博客...

第11章 Redis(一)

11.1 谈谈你对Redis的理解 难度:★★★ 重点:★★ 白话解析 对Redis的理解无非从三个方面去说一说:背景,是什么,特性。 背景:数据直接存磁盘太慢了,虽然MySQL用到了BufferPool等缓存,但是为了保证数据不丢失,MySQL采用的RedoLog依然要直接写磁盘。所以,数据的存储就…...

freertos信号量之二值信号量

freertos信号量之二值信号量 简介例程 简介 FreeRTOS的二值信号量&#xff08;Binary Semaphore&#xff09;是用于实现进程间同步和临界资源保护的重要工具。以下是一些二值信号量的常用函数及其说明&#xff1a; 1&#xff09;xSemaphoreCreateBinary() 创建一个二值信号量…...

notepad++ 如何去除换行

选中下方的“扩展” “查找目标”输入&#xff1a;\r\n&#xff0c;替换为:空白 最后全部替换。...

PPT NO.2 ​插入透明校徽

插入透明校徽&#xff1a; ①先下载一个校徽&#xff1a; ​ ②用矢量网站转换一下&#xff0c;这个免费的&#xff0c;很多其他的要钱钱&#xff1a; 位图转矢量图,JPG转矢量,PNG转矢量,GIF转矢量,BMP转矢量 - 在线工具 - 字客网 (fontke.com) 转换完了如下&#xff1a; 打…...

Linux系统部署PostgreSQL 单机数据库

安装方式 1 安装包方式 &#xff08;Packages and Installers&#xff09; 支持的操作系统包括 liunxMacosWindowsBSDSolaris 2 源码安装 &#xff08;Source code&#xff09; 下载源码包 通过下载地址PostgreSQL: File Browser 可以看到有各个版本的源码目录 选择13.1…...

好用的办公摸鱼神器

http://t.chaojizhu.cn/fawork/Down?uid180819...

手写Java序列化工具

一、思考 假设给一个java bean&#xff0c;让你按照 json 的格式打印出来&#xff0c;你会怎么做&#xff1f; 比如这个java bean 长这样&#xff0c;并且创建了一个叫宝儿姐的朋友 package com.test;public class User {private String name;private Integer age;private Bi…...

mysql面试题26:MySQL中什么是MVCC,它的底层原理是什么

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:什么是MVCC,它的底层原理是什么? MVCC(Multi-Version Concurrency Control)是一种并发控制机制,用于在数据库中实现并发事务的隔离性和一致性…...

SQL进阶 - SQL的编程规范

性能优化是一个很有趣的探索方向&#xff0c;将耗时耗资源的查询优化下来也是一件很有成就感的事情&#xff0c;但既然编程是一种沟通手段&#xff0c;那每一个数据开发者就都有义务保证写出的代码逻辑清晰&#xff0c;具有很好的可读性。 目录 引子 小试牛刀 答案 引言 …...

[NISACTF 2022]babyserialize - 反序列化+waf绕过【*】

[NISACTF 2022]babyserialize 一、解题过程二、思考总结&#xff08;一&#xff09;、关于题目的小细节&#xff08;二&#xff09;、关于弱类型比较技巧 一、解题过程 题目代码&#xff1a; <?php include "waf.php"; class NISA{public $fun"show_me_fl…...

docker部署Vaultwarden密码共享管理系统

Vaultwarden是一个开源的密码管理器&#xff0c;它是Bitwarden密码管理器的自托管版本。它提供了类似于Bitwarden的功能&#xff0c;允许用户安全地存储和管理密码、敏感数据和身份信息。 Vaultwarden的主要特点包括&#xff1a; 1. 安全的数据存储&#xff1a;Vaultwarden使…...

低代码开发技术选型

低代码的技术路径 低代码开发低代码开发优势低代码的技术路径1.表格驱动2.表单驱动3.数据模型4.领域模型 低代码的核心能力企业级低代码开发平台的11项关键能力低代码平台的流程引擎选型低代码平台的流程设计器选型低代码平台的表单设计器选型低代码平台的Vue.js 框架选型 低代…...

VHS Pro深度解析:Unity中模拟真实录像机信号链的原理与实践

1. 这不是“加个滤镜”那么简单&#xff1a;VHS Pro 的真实定位与行业缺口你打开 Unity Asset Store&#xff0c;搜“vhs”&#xff0c;会跳出二十多个插件。有的叫 VHS Effect&#xff0c;有的叫 Retro Tape&#xff0c;还有的直接叫 “80s Glitch”。点开预览图&#xff0c;全…...

基于i.MX8M Plus与5G的高性能AI边缘计算网关设计与实践

1. 项目概述&#xff1a;为什么我们需要一个“会思考”的边缘网关&#xff1f;在工业现场待久了&#xff0c;你一定会对几个场景深有感触&#xff1a;产线上几十台PLC和传感器&#xff0c;协议五花八门&#xff0c;Modbus、Profibus、CANopen&#xff0c;想统一采集数据得接一堆…...

从文件上传到 RAG 检索:真正看懂了一个 AI 项目的知识库链路

一、前言&#xff1a;今天不是单独学一个知识点&#xff0c;而是串起了一条完整链路 今天继续分析 AI 项目中的 RAG 模块时&#xff0c;我发现自己之前对“文件上传”“文件切片”“向量化”“召回”“大模型回答”这些概念&#xff0c;虽然都单独听过&#xff0c;但真正放到项…...

将数据从 OPPO 传输到 iPhone 的 4 个有效方案

拥有华丽的设计和强大的功能&#xff0c;谁不想拥有一部新的 iPhone&#xff1f;如果您是Android OPPO 用户&#xff0c;现在正准备换用新 iPhone&#xff0c;您可能会担心数据传输的问题。由于 OPPO 和 iPhone 的操作系统不同&#xff0c;很多人觉得将 OPPO 手机转换为 iPhone…...

Github创建项目(创建仓库、新建项目、新建仓库)步骤

文章目录 新建项目然后根据指示创建第一个提交并推送即可 新建项目 然后根据指示创建第一个提交并推送即可 echo "# xxxxxxxx" >> README.md git init git add README.md git commit -m "first commit" git branch -M main git remote add origin ht…...

0602光刻机 第六篇:EUV超精密光学系统(S级 长期死磕突破)超精密反射镜技术壁垒

第2小节&#xff1a;超精密反射镜技术壁垒&#xff08;基底加工镀膜检测&#xff0c;全量化死磕&#xff09;前置硬核声明EUV整机90%的成像误差、波像差、良率波动&#xff0c;最终全部归因于超精密反射镜的制造壁垒。EUV不是“普通光学抛光”&#xff0c;是原子级表面重构、皮…...

Midjourney大画幅风格实战手册(从失效黑边到完美展陈:2023全球TOP 50商业项目验证的7大避坑节点)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Midjourney大画幅风格的本质解构与视觉范式跃迁 大画幅风格并非单纯指图像物理尺寸的放大&#xff0c;而是Midjourney通过隐式参数空间重构所催生的一种高密度视觉语义范式——它融合了胶片颗粒质感、景深压缩…...

大牛直播SDK(SmartMediaKit)Windows平台RTSP/RTMP直播播放SDK集成说明(C#版)

文档概述 本文介绍大牛直播SDK&#xff08;SmartMediaKit&#xff09;在 Windows 平台下 RTSP、RTMP 直播播放模块的集成方法&#xff0c;面向 Windows Forms、WPF 等 C# 客户端应用场景&#xff0c;重点说明 SDK 集成准备、播放器初始化、RTSP/RTMP 播放、播放参数配置、事件…...

向量库+RAG+大模型在医疗AI中为何常显不足?揭秘图谱如何重塑医疗知识系统信任度!

文章指出&#xff0c;在医疗AI领域&#xff0c;单纯依赖向量库RAG大模型的经典路线已显不足。医疗场景对知识系统的要求远超“语义相似度”&#xff0c;涉及适应症、禁忌症、证据等级等严格约束。知识图谱在医疗AI中的重要性日益凸显&#xff0c;它不仅能够构建知识间的关系网络…...

2026年AI论文网站盘点:12款神器助你高效完成学术写作、润色和降重

随着 AI 技术的持续突破&#xff0c;2026 年的论文写作工具市场已迈入“智能化、精细化、合规化”的新阶段。从本科生的课程论文到研究生的学位论文&#xff0c;再到科研人员的期刊投稿&#xff0c;AI 工具正在深度融入各类学术场景&#xff0c;为不同层次的写作者提供精准支持…...