【设计模式】命令模式

devtools/2024/12/28 23:45:46/

什么是命令模式

命令模式是一种行为型设计模式

它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。

例如你正在开发一款新的文字编辑器, 包含多个按钮的工具栏, 每个按钮对应编辑器的不同操作。 你创建了一个非常简洁的 按钮类, 可用于生成工具栏上的按钮, 还可用于生成各种对话框的通用按钮。

代码示例

命令模式通常包含以下角色:

  1. Command(命令接口):声明执行操作的接口。
  2. ConcreteCommand(具体命令):将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute。
  3. Invoker(调用者):要求该命令执行这个请求。
  4. Receiver(接收者):知道如何执行一个与请求相关的操作,它执行任何具体命令。
#include <iostream>
#include <memory>
#include <vector>// Receiver 类
class Light {
public:void on() {std::cout << "The light is on" << std::endl;}void off() {std::cout << "The light is off" << std::endl;}
};// Command 接口
class Command {
public:virtual ~Command() = default;virtual void execute() = 0;
};// ConcreteCommand 类
class LightOnCommand : public Command {
public:explicit LightOnCommand(Light* light) : light_(light) {}void execute() override {light_->on();}private:Light* light_;
};class LightOffCommand : public Command {
public:explicit LightOffCommand(Light* light) : light_(light) {}void execute() override {light_->off();}private:Light* light_;
};// Invoker 类
class RemoteControl {
public:void setCommand(std::unique_ptr<Command> command) {command_ = std::move(command);}void pressButton() {if (command_) {command_->execute();}}private:std::unique_ptr<Command> command_;
};int main() {Light light;RemoteControl remote;remote.setCommand(std::make_unique<LightOnCommand>(&light));remote.pressButton(); // 输出: The light is onremote.setCommand(std::make_unique<LightOffCommand>(&light));remote.pressButton(); // 输出: The light is offreturn 0;
}

主要优点


• 解耦请求发送者和接收者:发送者和接收者之间的耦合被降低。
• 支持队列和日志记录:可以很容易地实现命令队列和日志记录功能。
• 易于扩展:新增加一个命令只需要添加一个新的命令类。
• 支持撤销操作:可以轻松实现命令的撤销和重做。


http://www.ppmy.cn/devtools/146233.html

相关文章

React 组件中 State 的定义、使用及正确更新方式

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容React 组件中 State 的定义、使用及正确更新方式 前言 在 React 应用开发中&#xff0c;state …

R语言的数据类型

标题&#xff1a;《探索R语言数据类型的奥秘》 引言&#xff1a; 在统计学和数据分析的世界里&#xff0c;R语言无疑是一颗璀璨的明星。它以其强大的数据处理能力和丰富的图形展示功能而受到广泛欢迎。然而&#xff0c;要熟练掌握并高效使用R语言&#xff0c;深入了解其数据类…

Linux应用软件编程-多任务处理(进程)

多任务&#xff1a;让系统具备同时处理多个事件的能力。让系统具备并发性能。方法&#xff1a;进程和线程。这里先讲进程。 进程&#xff08;process&#xff09;&#xff1a;正在执行的程序&#xff0c;执行过程中需要消耗内存和CPU。 进程的创建&#xff1a;操作系统在进程创…

SQL-leetcode-180. 连续出现的数字

180. 连续出现的数字 表&#xff1a;Logs -------------------- | Column Name | Type | -------------------- | id | int | | num | varchar | -------------------- 在 SQL 中&#xff0c;id 是该表的主键。 id 是一个自增列。 找出所有至少连续出现三次的数字。 返回的…

DocFlow票据AI自动化处理工具,提升企业票据数字化管理效能

随着全球化与信息化进程&#xff0c;企业的文件、信息、数据吞吐量不断增长&#xff0c;2020年以来&#xff0c;业务形势的变革再次加速了企业对先进的文档数字化管理解决方案需求。其中&#xff0c;票据处理始终面临着文件量大耗时、单据高度多样化、“淡旺季”周期波动性强、…

.NET周刊【12月第3期 2024-12-15】

国内文章 重磅推出 Sdcb Chats&#xff1a;一个全新的开源大语言模型前端 https://www.cnblogs.com/sdcb/p/18597030/sdcb-chats-intro Sdcb Chats是一个新推出的开源大语言模型前端&#xff0c;旨在提升用户交互体验&#xff0c;并填补市场上基于.NET的前端空白。它引入树状…

vulnhub靶机billu_b0x精讲

靶机下载 https://www.vulnhub.com/entry/billu-b0x,188/ 信息收集 扫描存活主机 nmap -sP 192.168.73.0/24 192.168.73.141为目标主机&#xff0c;对其进行进一步信息收集 端口扫描 nmap --min-rate10000 -p- 192.168.73.141 目标只开放了22和80端口 针对端口进行TCP探…

node-js Express-路由模块化

路由模块化 减少多人开发过程中冲突&#xff0c;代码整洁&#xff0c;管理方便。&#xff08;不完全解释&#xff09; 模块化结构 routes里面放的是模块分类路由 // 以adminroute.js为例const express require(express)//创建路由对象const router express.Router()router…