首页 > 其他分享 >设计模式--Command模式

设计模式--Command模式

时间:2023-11-11 20:46:06浏览次数:22  
标签:execute 请求 -- 命令 command Receiver Command 设计模式

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

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

  1. Command(抽象命令类):声明执行操作的接口。
  2. ConcreteCommand(具体命令类):是一个具体的命令,将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute。
  3. Invoker(调用者):要求该命令执行这个请求。
  4. Receiver(接收者):知道如何实施与执行一个请求相关的操作。

命令模式的主要优点是:

  • 降低系统的耦合度。
  • 新的命令可以很容易地加入到系统中。
    命令模式适用于以下场景:
  • 支持撤销的操作。
  • 支持修改、排队或者追踪请求。
  • 如果一个请求的接收者不明确,或者一个请求需要被多个对象处理。
  • 用于处理一系列请求,可以进行批处理。

以下是一个简单的C++实现的命令模式(Command Pattern)示例:

#include <iostream>

// 抽象命令类
class Command {
public:
    virtual void execute() = 0;
    virtual ~Command() {}
};

// 接收者类
class Receiver {
public:
    void action() {
        std::cout << "Receiver action..." << std::endl;
    }
};

// 具体命令类
class ConcreteCommand : public Command {
public:
    ConcreteCommand(Receiver* receiver) : receiver_(receiver) {}
    void execute() override {
        receiver_->action();
    }

private:
    Receiver* receiver_;
};

// 调用者类
class Invoker {
public:
    Invoker(Command* command) : command_(command) {}
    void call() {
        command_->execute();
    }

private:
    Command* command_;
};

int main() {
    Receiver* receiver = new Receiver();
    Command* command = new ConcreteCommand(receiver);
    Invoker* invoker = new Invoker(command);

    invoker->call();

    delete invoker;
    delete command;
    delete receiver;

    return 0;
}

在这个例子中,Command是抽象命令类,定义了一个execute接口。ConcreteCommand是具体命令类,实现了execute接口。
Receiver是接收者类,它知道如何实施和执行一个请求相关的操作。在ConcreteCommand的execute接口中,调用了Receiver的action接口。
Invoker是调用者类,它要求命令执行一个请求,也就是调用命令的execute接口。
通过这种方式,我们可以将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

标签:execute,请求,--,命令,command,Receiver,Command,设计模式
From: https://www.cnblogs.com/lanyangsh/p/17826318.html

相关文章

  • 高效利用队列的空间
      大家都知道队列是可以用数组来模拟的,可以先开辟一段定长的数组空间,然后分别使用两个变量head和tail来代指队列的头和尾,从而维护整个队列,相信到这里大家都比较熟悉。不过这种做法是有弊端的,比如说下图这种情况  假设经过不断地增删元素,Head和Tail已经来到了数组最后两个位......
  • 图有关算法题
    图的结构//严蔚敏版数据结构//邻接表存储结构typedefstructArcNode{intadjvex;//该弧所指向的顶点的位置structArcNode*nextarc;//下一个边结点}ArcNode;typedefstructVNode{VertexTypedata;//顶点信息structArcNode*firstarc;//第一个邻接点......
  • 【爱芯派 Pro 开发板试用体验】+基本使用环境配置
    【爱芯派Pro开发板试用体验】+基本使用环境配置登录系统系统默认为debian系统,插入网线,插入显示器,鼠标、键盘,介绍基础系统使用操作。将M4N-Dock连接上显示器后,可以看到图形化交互界面了。在登录界面,输入用户名root,密码root就可以登录进系统了。进入系统后的界面如下:......
  • python中包管理工具pip以及虚拟环境venv的使用
    1.pip命令查看已安装的包piplist安装包pipinstallpackage_name卸载包#卸载指定包pipuninstallpackage_name#卸载已安装的所有第三方Python库pipfreeze>list.txtpipuninstall-rlist.txt-y导出已安装的包pipfreeze>requirements.txt配置全局默......
  • Measures to solve ocean trash
    (1)Strengthenlawenforcementefforts,trulyachievethegoalof"strictlawenforcementandpunishmentforviolations",strengthenlawenforcementsupervisionofgovernmentenvironmentalprotectionfunctionaldepartments,overcomelocalprotec......
  • Vue2中的父子通信
    父子通信流程图:父组件通过props将数据传递给子组件子组件利用$emit通知父组件修改更新父组件传递子组件注意点但是需要注意的是,通过props传递的数据是只读状态的,也就是说,我们不能去修改这个值。注意:props是只读的,如果直接对props中的数据进行修改,Vue就会发出警告。如果......
  • Sovit2D组态设计 Web Scada烟气脱硫工艺流程
    前言我国是燃煤大国,燃煤排放的SO₂成为影响我国城市空气质量的主要污染物。因此,锅炉烟气脱硫是减排SO₂的重要手段。建设背景在节能减排的大形势下,钢厂、电厂等烟气脱硫是完成二氧化硫减排任务的重点工作之一。烟气脱硫系统具有很高的复杂性,目前很多脱硫系统出现运行故障多、不能......
  • C++ 采用get()和put()读写文件
    在某些特殊的场景中,我们可能需要逐个读取文件中存储的字符,或者逐个将字符存储到文件中。这种情况下,就可以调用get()和put()成员方法实现。C++ostream::put()成员方法通过《C++cout.put()》一节的学习,读者掌握了如何通过执行cout.put()方法向屏幕输出单个字符。我们知道,fstr......
  • C++ 使用getline():从文件中读取一行字符串
    getline()方法从cin输入流缓冲区中读取一行字符串。在此基础上,getline()方法还适用于读取指定文件中的一行数据,本节就给大家做详细的讲解。我们知道,getline()方法定义在istream类中,而fstream和ifstream类继承自istream类,因此fstream和ifstream的类对象可以调用ge......
  • C++ 采用read()和write()读写二进制文件
    以文本形式读写文件和以二进制形式读写文件的区别,并掌握了用重载的>>和<<运算符实现以文本形式读写文件。在此基础上,本节继续讲解如何以二进制形式读写文件。举个例子,现在要做一个学籍管理程序,其中一个重要的工作就是记录学生的学号、姓名、年龄等信息。这意味着,我们需要用一个......