23种计划模式 - 下令模式

十念  金牌会员 | 6 天前 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 875|帖子 875|积分 2625

模式定义

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

模式布局

抽象下令类(Command)


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

实用场景

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

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

场景说明:
数控机床通过控制面板发送下令(启动、停息、急停),下令被封装为对象,支持操纵记录和撤销。
  1. #include
  2. #include
  3. #include
  4. // 接收者:数控机床
  5. class CNC_Machine {
  6. public:
  7.     void start() {
  8.         std::cout << "数控机床启动,开始加工..." << std::endl;
  9.     }
  10.     void pause() {
  11.         std::cout << "数控机床暂停..." << std::endl;
  12.     }
  13.     void emergencyStop() {
  14.         std::cout << "紧急停止!机床复位中..." << std::endl;
  15.     }
  16. };
  17. // 抽象命令类
  18. class Command {
  19. public:
  20.     virtual ~Command() = default;
  21.     virtual void execute() = 0;
  22.     virtual void undo() = 0;  // 支持撤销操作[4][7]
  23. };
  24. // 具体命令:启动命令
  25. class StartCommand : public Command {
  26. private:
  27.     CNC_Machine& receiver_;
  28. public:
  29.     explicit StartCommand(CNC_Machine& machine) : receiver_(machine) {}
  30.     void execute() override {
  31.         receiver_.start();
  32.     }
  33.     void undo() override {
  34.         std::cout << "撤销启动:停止加工" << std::endl;
  35.     }
  36. };
  37. // 具体命令:急停命令
  38. class EmergencyStopCommand : public Command {
  39. private:
  40.     CNC_Machine& receiver_;
  41. public:
  42.     explicit EmergencyStopCommand(CNC_Machine& machine) : receiver_(machine) {}
  43.     void execute() override {
  44.         receiver_.emergencyStop();
  45.     }
  46.     void undo() override {
  47.         std::cout << "撤销急停:恢复运行状态" << std::endl;
  48.     }
  49. };
  50. // 调用者:控制面板
  51. class ControlPanel {
  52. private:
  53.     std::stack> history_;
  54. public:
  55.     void executeCommand(std::unique_ptr cmd) {
  56.         cmd->execute();
  57.         history_.push(std::move(cmd));  // 记录操作历史[4][7]
  58.     }
  59.     void undoLastCommand() {
  60.         if (!history_.empty()) {
  61.             history_.top()->undo();
  62.             history_.pop();
  63.         }
  64.     }
  65. };
  66. // 客户端使用
  67. int main() {
  68.     CNC_Machine machine;
  69.     ControlPanel panel;
  70.     // 发送启动命令
  71.     panel.executeCommand(std::make_unique(machine));
  72.    
  73.     // 发送急停命令
  74.     panel.executeCommand(std::make_unique(machine));
  75.    
  76.     // 撤销上一次操作
  77.     panel.undoLastCommand();  // 输出:撤销急停:恢复运行状态
  78.     return 0;
  79. }
复制代码

代码解析
接收者:CNC_Machine类实现机床的现实操纵(如启动、急停)。
详细下令:StartCommand和EmergencyStopCommand封装操纵,关联接收者对象。
调用者:ControlPanel管理下令执行历史,支持撤销操纵。
解耦上风:新增下令(如停息下令)只需扩展Command子类,无需修改调用者代码。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表