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

23种设计模式 - 命令模式

模式定义

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为独立对象,使请求的发送者与接收者解耦。通过将操作抽象为命令对象,支持命令的存储、传递、撤销和重做,增强系统的灵活性和可扩展性。


模式结构

抽象命令类(Command)

  • 定义执行命令的统一接口(如execute()方法),声明撤销/重做等扩展功能。
    具体命令类(ConcreteCommand)
  • 实现抽象命令接口,关联接收者对象并调用其具体方法(如启动、暂停数控机床)。
    接收者(Receiver)
  • 实际执行操作的对象(如数控机床),包含具体的业务逻辑。
    调用者(Invoker)
  • 持有命令对象并触发其执行(如数控系统控制面板)。
    客户端(Client)
  • 创建命令对象并配置其接收者。

适用场景

操作队列化:如数控系统需要支持批量执行加工指令。
撤销/重做功能:支持机床操作的历史记录回滚。
分布式通信:将远程控制指令封装为可传输对象。


C++示例(数控系统场景)

场景说明:
数控机床通过控制面板发送命令(启动、暂停、急停),命令被封装为对象,支持操作记录和撤销。

#include 
#include 
#include 

// 接收者:数控机床
class CNC_Machine {
public:
    void start() { 
        std::cout << "数控机床启动,开始加工..." << std::endl; 
    }
    void pause() { 
        std::cout << "数控机床暂停..." << std::endl; 
    }
    void emergencyStop() { 
        std::cout << "紧急停止!机床复位中..." << std::endl; 
    }
};

// 抽象命令类
class Command {
public:
    virtual ~Command() = default;
    virtual void execute() = 0;
    virtual void undo() = 0;  // 支持撤销操作[4][7]
};

// 具体命令:启动命令
class StartCommand : public Command {
private:
    CNC_Machine& receiver_;
public:
    explicit StartCommand(CNC_Machine& machine) : receiver_(machine) {}
    void execute() override { 
        receiver_.start(); 
    }
    void undo() override { 
        std::cout << "撤销启动:停止加工" << std::endl; 
    }
};

// 具体命令:急停命令
class EmergencyStopCommand : public Command {
private:
    CNC_Machine& receiver_;
public:
    explicit EmergencyStopCommand(CNC_Machine& machine) : receiver_(machine) {}
    void execute() override { 
        receiver_.emergencyStop(); 
    }
    void undo() override { 
        std::cout << "撤销急停:恢复运行状态" << std::endl; 
    }
};

// 调用者:控制面板
class ControlPanel {
private:
    std::stack> history_;
public:
    void executeCommand(std::unique_ptr cmd) {
        cmd->execute();
        history_.push(std::move(cmd));  // 记录操作历史[4][7]
    }
    void undoLastCommand() {
        if (!history_.empty()) {
            history_.top()->undo();
            history_.pop();
        }
    }
};

// 客户端使用
int main() {
    CNC_Machine machine;
    ControlPanel panel;

    // 发送启动命令
    panel.executeCommand(std::make_unique(machine));
    
    // 发送急停命令
    panel.executeCommand(std::make_unique(machine));
    
    // 撤销上一次操作
    panel.undoLastCommand();  // 输出:撤销急停:恢复运行状态

    return 0;
}

代码解析
接收者:CNC_Machine类实现机床的实际操作(如启动、急停)。
具体命令:StartCommandEmergencyStopCommand封装操作,关联接收者对象。
调用者:ControlPanel管理命令执行历史,支持撤销操作。
解耦优势:新增命令(如暂停命令)只需扩展Command子类,无需修改调用者代码。

相关文章:

  • k8s学习记录(二):Pod基础篇
  • Go 之 Windows下 Beego 项目的搭建
  • 鸿蒙状态管理概述 v2
  • 计算机组成原理——输入/输出系统(十六)
  • 【分布式】Hadoop完全分布式的搭建(零基础)
  • Windows 11运行《拳皇98UM》等老游戏闪退解决方案
  • 《运维工程师如何利用DeepSeek实现智能运维:分级实战指南》
  • qt的下载安装详细介绍
  • 8.【线性代数】——求解Ax=b
  • C++:类之间的关系
  • 基于golang语言开发publicChain项目实战教程
  • Aseprite绘画流程案例(3)——卡通独角兽可爱
  • python入门笔记4
  • glob 用法技巧
  • 撕碎QT面具(4):horizontal Layout修改各个控件的比例大小
  • 【Golang 面试题】每日 3 题(五十九)
  • 以deepseek为例的AI学习及公司知识库的搭建
  • Golang 相关的github 开源项目
  • 便捷批量字符一键查找替换工具
  • 首页 layout 架子(element-plus菜单组件)
  • 独行侠以1.8%概率获得状元签,NBA原来真的有剧本?
  • “远践”项目启动公益生态圈,上海青少年公益力量蓬勃生长
  • 联合国秘书长欢迎中美经贸高层会谈成果
  • 书法需从字外看,书法家、学者吴本清辞世
  • 长三角议事厅·周报|从模速空间看上海街区化AI孵化模式
  • 上海下周最高气温在30℃附近徘徊,夏天越来越近