当前位置: 首页 > news >正文

行为模式---命令模式

概念

命令模式是一种行为设计模式,它的核心思想就是将请求封装为一个对象,此对象包含与请求相关的所有信息。可以用不同的请求对客户进行参数化。命令模式通过将请求的发送者和接收者解耦,支持请求的排队、记录、撤销等操作。

使用场景

1、如果需要通过参数来操作对象,可以使用命令模式。

2、如果想要把操作放入到对象中进行操作执行或者远程执行操作就需要命令模式。

3、如果想要实现操作回滚操作,就需要用到命令模式。

实现方式

1、使用命令模式需要至少创建三个类,一个命令的接口类,一个是命令的调用类,一个实际接受者对象(简单命令可以没有);

2、创建一个仅有一个执行方法的命令接口。通过继承命令接口创建一系列不同的具体命令类,具体命令类中实现方法。每个具体的命令类必须保存请求参数和实际接受者对象的引用。所有的变量只能在构造函数中进行初始化。

3、创建命令的调用类,也是发送命令的类,在这些类中添加保存命令的成员变量,发生者只能通过命令接口与其命令进行交互,发送者本身不创建对象,命名对象是通过参数设置到调用类的。

4、客户端的初始化。
​ 1)创建接受者
​ 2)创建命令,有需要的话可以关联接受者对象。
​ 3)创建发送者,需要将命令进行关联(也就是将命令设置到发送者)。

类结构图

在这里插入图片描述

示例代码

#include "MingLingMoShi.h"int main()
{std::cout << "欢迎东哥来到设计模式的世界!\n";//创建命令对象CommandBase* command = new ConcreteCommend();CommandBase* command1 = new ConcreteCommend1();//创建调用者Invoker invoker;invoker.setCommend(command);invoker.execte();invoker.setCommend(command1);invoker.execte();
}
#pragma once
#include <iostream>
using namespace std;//接受者类
class Receiver {
public:Receiver() {}~Receiver() {}void execte() {cout << "Receiver 接收者对象执行操作函数" << endl;}
};//命令基类
class CommandBase
{
public:CommandBase() {}~CommandBase() {}virtual bool execte() = 0;
};//具体命令,不使用接受者
class ConcreteCommend : public CommandBase {
public:ConcreteCommend() {}~ConcreteCommend() {}bool execte() {cout << "ConcreteCommend 没有使用接受者的命令对象" << endl;return true;}
};//具体命令,使用接受者
class ConcreteCommend1 : public CommandBase {
public:ConcreteCommend1() {}~ConcreteCommend1() {}bool execte() {cout << "ConcreteCommend1 使用接受者的命令对象" << endl;m_receiver = new Receiver();m_receiver->execte();return true;}
private:Receiver* m_receiver;
};//调用者
class Invoker {
public:Invoker() {}~Invoker() {}void setCommend(CommandBase * command) {m_command = command;}void execte() {m_command->execte();}
private:CommandBase* m_command;};
http://www.lryc.cn/news/546457.html

相关文章:

  • zabbix配置邮件告警
  • INI和CSV文件保存
  • 汽车智能钥匙中PKE低频天线的作用
  • 计算机等级考试
  • Geotools中获取Shapefile的属性表格字符集编码的一种方法
  • HTTP 与 HTTPS 协议:从基础到安全强化
  • Scrapy爬虫框架介绍
  • Stable Diffusion模型高清算法模型类详解
  • 软考网络安全口诀
  • Baklib内容中台赋能企业智管
  • vscode+vue前端开发环境配置
  • Python项目-基于深度学习的校园人脸识别考勤系统
  • 浅谈C++函数特性
  • Python----数据分析(Matplotlib三:绘图二:箱图,散点图,饼图,热力图,3D图)
  • 高性能PHP框架webman爬虫引擎插件,如何爬取数据
  • 【2025年后端开发终极指南:云原生、AI融合与性能优化实战】
  • 健康养生:开启活力人生的钥匙
  • vue2+ele-ui实践
  • 三维重建(十五)——多尺度(coarse-to-fine)
  • SparkStreaming之04:调优
  • 勿以危小而为之勿以避率而不为
  • JavaWeb后端基础(4)
  • SpringBoot调用DeepSeek
  • 记录一下本地部署Dify的坑
  • LC109. 有序链表转换平衡二叉搜索树
  • Hutool一个类型转换工具类 `Convert`,
  • 基于eRDMA实测DeepSeek开源的3FS
  • 【Linux篇】第一个系统程序 - 进度条
  • VLM-E2E:通过多模态驾驶员注意融合增强端到端自动驾驶
  • 如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档