(三)行为模式:2、命令模式(Command Pattern)(C++示例)

news2024/11/24 2:27:49

目录

1、命令模式(Command Pattern)含义

2、命令模式的UML图学习

3、命令模式的应用场景

4、命令模式的优缺点

5、C++实现命令模式的实例


1、命令模式(Command Pattern)含义

命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。【DP】

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使不同的请求可以参数化其他对象。通过将请求发送者和接收者解耦,命令模式可以支持请求的排队、记录日志、撤销等操作。

2、命令模式的UML图学习

 命令模式主要包含以下几个角色:

(1)命令接口(Command):定义了执行命令的方法。

(2)具体命令(Concrete Command):实现了命令接口,并持有一个接收者对象的引用,负责调用接收者的方法来执行具体的操作。

(3)接收者(Receiver):执行具体操作的对象。

(4)请求者(Invoker):持有一个命令对象,并在需要时调用命令对象的执行方法。

3、命令模式的应用场景

(1)需要将请求发送者和接收者解耦的情况。

(2)需要支持撤销、重做等操作的情况。

(3)需要支持请求排队、记录日志等操作的情况。

4、命令模式的优缺点

(1)优点:

1)解耦请求发送者和接收者:请求发送者只需要知道如何发送命令,而无需关心具体的接收者和操作。

2)可扩展性:可以方便地新增或修改命令类,无需修改已有的代码。

3)支持撤销和重做:由于命令被封装成对象,可以轻松地实现撤销和重做操作。

(2)缺点:

1)类的数量增加:每个具体命令都需要一个对应的类,可能会导致类的数量过多。

2)系统复杂性增加:引入了额外的类和对象,增加了系统的复杂性。

5、C++实现命令模式的实例


#include <iostream>
#include <vector>

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

// 具体命令A
class ConcreteCommandA : public Command 
{
private:
    // 接收者对象
    Receiver* receiver;

public:
    ConcreteCommandA(Receiver* recv) : receiver(recv) {}

    void execute() override 
    {
        receiver->actionA();
    }
};

// 具体命令B
class ConcreteCommandB : public Command 
{
private:

    // 接收者对象
    Receiver* receiver;

public:
    ConcreteCommandB(Receiver* recv) : receiver(recv) {}

    void execute() override 
    {
        receiver->actionB();
    }
};

// 接收者
class Receiver 
{
public:
    void actionA() 
    {
        std::cout << "执行接收者的操作A" << std::endl;
    }

    void actionB() 
    {
        std::cout << "执行接收者的操作B" << std::endl;
    }
};

// 请求者
class Invoker 
{
private:
    std::vector<Command*> commands;

public:
    void addCommand(Command* command) 
    {
        commands.push_back(command);
    }

    void executeCommands() 
    {
        for (Command* command : commands) 
        {
            command->execute();
        }
    }
};

int main() 
{
    // 创建接收者对象
    Receiver receiver;

    // 创建具体命令对象,并设置接收者
    ConcreteCommandA commandA(&receiver);
    ConcreteCommandB commandB(&receiver);

    // 创建请求者对象,并添加命令
    Invoker invoker;
    invoker.addCommand(&commandA);
    invoker.addCommand(&commandB);

    // 执行命令
    invoker.executeCommands();

    return 0;
}

在上述示例中,命令接口(Command)定义了执行命令的方法。具体命令(Concrete Command)实现了命令接口,并持有一个接收者对象的引用,负责调用接收者的方法来执行具体的操作。接收者(Receiver)执行具体的操作。请求者(Invoker)持有一个或多个命令对象,并在需要时调用命令对象的执行方法。

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

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

相关文章

土地利用变化碳排放效应的遥感监测、生态系统碳库的遥感估算、收支的遥感模拟、能源消耗碳排放空间格局模拟

以全球变暖为主要特征的气候变化已成为全球性环境问题&#xff0c;对全球可持续发展带来严峻挑战。2015年多国在《巴黎协定》上明确提出缔约方应尽快实现碳达峰和碳中和目标。2019年第49届 IPCC全会明确增加了基于卫星遥感的排放清单校验方法。随着碳中和目标以及全球碳盘点的现…

UI界面设置

文章目录 1. 修改 share.html 内容如下&#xff1a;2. 修改 html 文件格式为 utf-83.保存&#xff0c;运行程序4. 访问页面 1. 修改 share.html 内容如下&#xff1a; <!DOCTYPE html><html> <head><meta charset"utf-8"><title>1v1屏…

创建和使用角色

创建和使用角色 根据下列要求&#xff0c;在 /home/curtis/ansible/roles 中创建名为 apache 的角色&#xff1a; httpd 软件包已安装&#xff0c;设为在系统启动时启用并启动 防火墙已启用并正在运行&#xff0c;并使用允许访问 Web 服务器的规则 模板文件 index.html.j2 已存…

【ROS】服务通信--从理论介绍到模型实现

一、概念介绍 服务通信也是ROS中一种极其常用的通信模式&#xff0c;服务通信是基于请求响应模式的&#xff0c;是一种应答机制。也即: 一个节点A向另一个节点B发送请求&#xff0c;B接收处理请求并产生响应结果返回给A。 一个节点需要向相机节点发送拍照请求&#xff0c;相机…

关于STM32Cube的HAL库使用RTOS设置且给芯片下载的注意事项

学了标准库和RTOS之后&#xff0c;发现HAL库开发比较快&#xff0c;于是尝试使用HAL库开发ROTS程序&#xff0c; 第一次下载程序到芯片发现程序是运行了&#xff0c;但是不能再次下载程序&#xff08;也就是不能检测到ST-link或者DIP等接口&#xff09; 于是根据BOOT0和BOOT1…

璞睿互联教师评价系统 | 助推教师评价改革,促进教学智能化发展!

近年来&#xff0c;随着信息技术的不断发展&#xff0c;教育评价面临了一系列挑战。主要表现在教学评价空间的广泛场景化、教学评价内容的多元化以及教学评价方式的智能化。为了应对这些挑战并满足新时代教育评价改革的需求&#xff0c;璞睿互联积极探索实现教师评价智能化的途…

Fedora38下中文输入法,与切换问题

前言 首先&#xff0c;由于本人先前一直用Ununtu&#xff0c;下意识会安装googlepinyin,但是在Fedpra上其实根本没有必要这样做&#xff0c;他是支持汉语输入&#xff0c;而且做得更好。 一、安装汉语键盘输入 1、点击setting(设置) 2、找到keyboard(键盘)、Input Sourses(点…

C#__基本特性和使用

// 特性&#xff08;attribute&#xff09;: // 一种允许我们向程序集添加元数据的语言结构 // 用于保存程序结构信息的某种特殊类型的类 // 类似“批注”&#xff0c;用于解释说明 #define IsShowMessage // 宏定义&#xff0c;在开头定义&#xff0…

Python面向对象植物大战僵尸

先来一波效果图 来看看如何设计游戏架构 import sysimport pygameclass BaseSprite(pygame.sprite.Sprite):def __init__(self, name):super().__init__()self.image pygame.image.load(name)self.rect self.image.get_rect()class AnimateSprite(BaseSprite):def __init__(…

ARM体系结构学习笔记:PC寄存器

PC寄存器 32位thumb也是采用三级流水线结构,但是每个指令位2个字节因此4thumb模式读PC寄存器 mov r0, pc ; thumb mode r0 pc 4LDR R1, (aLd - 0xAC3B62C) ADD R1, PC ; "%ld\n"thumb模式使用LDR使用PC进行间接寻址 如…

jvs-logic(逻辑引擎)的产生背景和使用场景作用

逻辑引擎的由来 要了解逻辑引擎的产生背景&#xff0c;我们需要了解程序执行的基本原理&#xff0c;那么编译是少不了的&#xff0c;编译是将高级语言翻译成为机器可以执行的机器语言 。我们在做日常开发过程中&#xff0c;把通用的业务逻辑通过高级语言写出来后&#xff0c;需…

2022年12月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;数组逆序重放 将一个数组中的值按逆序重新存放。例如&#xff0c;原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。 输入 输入为两行&#xff1a;第一行数组中元素的个数n(1 输出 输出为一行&#xff1a;输出逆序后数组的整数&#xff0c;每两个整数之间用空格分隔…

87-基于stm32单片机粮仓仓库环境温湿度烟雾监测报警系统Proteus仿真+源码

资料编号&#xff1a;087 一&#xff1a;功能介绍&#xff1a; 1、采用stm32单片机OLED显示屏烟雾浓度检测DHT11温湿度电机按键蜂鸣器&#xff0c;制作一个温湿度采集、烟雾浓度采集&#xff0c;OLED显示相关数据&#xff0c; 2、通过按键设置温度上限、烟雾浓度上限&#xff0…

逻辑漏洞合集

0x01 未授权 未授权问题为普通用户登录或没有登录后&#xff0c;拼接js接口&#xff0c;构造报文&#xff0c;越权实现管理员的权限操作。原因&#xff1a;后端没有校验Cookie/Session的身份信息&#xff0c;以至于普通用户的权限可以实现管理员权限的功能。 First webpack打…

dll修复精灵怎么下载,vcruntime140.dll丢失该如何修复

vcruntime140.dll是Microsoft Visual C Redistributable中的一个动态链接库&#xff08;DLL&#xff09;文件。它是一种运行时库&#xff08;Runtime Library&#xff09;&#xff0c;用于支持使用Microsoft Visual C编写的程序的正常运行。作为一个DLL文件&#xff0c;vcrunti…

ModStartCMS v7.0.0 多语言开发优化,多个常用组件升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

超越传统测试方法:掌握最新的测试技术和工具

随着科技的不断进步和软件行业的快速发展&#xff0c;传统的测试方法已经无法满足现代软件开发的需求。为了提高测试的效率和准确性&#xff0c;测试人员需要及时掌握最新的测试技术和工具。本文将探讨一些创新的测试技术和工具&#xff0c;帮助测试人员超越传统的测试方法。 首…

Visual Studio 配置远程调试

1.在Visual Studio安装目录中找到远程调试工具(msvsmon.exe)。 2.将x64文件夹压缩成压缩包&#xff0c;然后拷贝到客户机 3.将pdb文件拷贝到客户机上版本对应的文件夹中。 4. 启动Visual Studio开始进行远程调试 选择“调试”> “附加到进程”

p-级数的上界(Upper bound of p-series)

积分判别法-The Integral Test https://math.stackexchange.com/questions/2858067/upper-bound-of-p-series https://courses.lumenlearning.com/calculus2/chapter/the-p-series-and-estimating-series-value/ 两个重要级数&#xff08;p级数和几何级数&#xff09; ht…

探索OLED透明屏方案的设计与应用

OLED透明屏作为一种新兴的显示技术&#xff0c;正逐渐在商业展示、新媒体互动和智能家居等领域展现出广阔的应用前景。 在这篇文章中&#xff0c;尼伽将深入探讨OLED透明屏方案的设计和应用&#xff0c;展示其在提升用户体验和创造商业价值方面的优势。 一、OLED透明屏方案的设…