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

};

相关文章:

  • 自动索引技术实操
  • ZCC5090EA适用于TYPE-C接口,集成30V OVP功能, 最大1.5A充电电流,带NTC及使能功能,双节锂电升压充电芯片替代CS5090EA
  • SQLite Alter 命令详解
  • 使用VSCode Debugger 调试 React项目
  • AutoGen学习笔记系列(二)Tutorial - Messages
  • 服务降级
  • 惯性动捕手套:高精度、高性价比虚拟现实手套
  • 1.3 ASPICE的质量管理
  • 力扣刷题DAY4(哈希表+双指针/简单)
  • OpenHarmony 进阶——HDF 驱动框架的原理小结
  • PPT 小黑第38套
  • AI入门7:基于Ollama+DeepSeek+Dify搭建本地知识库
  • 28.<Spring博客系统⑤(部署的整个过程(CentOS))>
  • 鸿蒙HarmonyOS NEXT开发:使用三方库实现Echarts图表功能的实战指南
  • 大型网站系统架构演化相关书籍
  • 洛谷 P2437:蜜蜂路线 ← 高精度加法 + Fibonacci
  • 【秩序的涌现 关键字摘取】
  • 缓存那些事儿
  • 基于Windows11的RAGFlow安装方法简介
  • Serilog: 强大的 .NET 日志库
  • 沪浙网站/下载百度2023最新版
  • 莆田市秀屿区建设局网站/百度搜索排行榜
  • 埃及网站后缀/写文的免费软件
  • 政府建设网站申请/应用市场
  • 建一个门户网站多少钱/燕郊今日头条
  • 独立站是什么意思/竞价推广托管公司价格