《命令模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客


模式说明

  • 方案: 命令模式将请求封装成一个对象,从而允许客户端参数化对象,将请求排入队列或者记录请求日志,以及支持可撤销的操作。
  • 优点:
    • 解耦了发送者和接收者,发送者无需知道接收者的细节,只需知道命令即可。
    • 支持撤销操作,因为命令对象包含了执行操作所需的信息。
  • 缺点:
    • 可能会导致类的数量增加,因为每个命令都需要一个具体的命令类。

本质思想:把调用的语义封装在一个具体的命令对象中,再创建一个执行调用命令的方法,这样对于所有传入的命令,都可以复用"调用命令的方法"。比如"一只鸟飞起来,然后吃东西",会有一个有一个调用命令的方法,做的事情是"先执行A,再执行B",然后传入命令A为"燕子飞起来",传入"燕子吃东西"。核心收益是,命令调用者的逻辑就可以复用了。

实践建议:在命令调用顺序固定,且使用高频时,把这部分逻辑抽象出命令模式。降低命令流程和命令本身的耦合。注意这块不适合放在业务占用cpu极高的代码部分,它对性能有少量影响。

代码示例:

cpp 复制代码
#include <iostream>
#include <vector>

// Command Interface
class Command {
public:
    virtual void execute() = 0;
};

// Receiver
class Bird {
public:
    virtual void fly() = 0;
    virtual void eat() = 0;
};

// Concrete Receiver
class Sparrow : public Bird {
public:
    void fly() override {
        std::cout << "Sparrow is flying." << std::endl;
    }
    void eat() override {
        std::cout << "Sparrow is eating." << std::endl;
    }
};

// Concrete Command for flying
class FlyCommand : public Command {
private:
    Bird* bird;

public:
    FlyCommand(Bird* bird) : bird(bird) {}

    void execute() override {
        bird->fly();
    }
};

// Concrete Command for eating
class EatCommand : public Command {
private:
    Bird* bird;

public:
    EatCommand(Bird* bird) : bird(bird) {}

    void execute() override {
        bird->eat();
    }
};

// Invoker
class Invoker {
private:
    std::vector<Command*> commands;

public:
    void addCommand(Command* command) {
        commands.push_back(command);
    }

    void executeCommands() {
        for (Command* command : commands) {
            command->execute();
        }
    }
};

int main() {
    Sparrow sparrow;
    FlyCommand flyCommand(&sparrow);
    EatCommand eatCommand(&sparrow);

    Invoker invoker;
    invoker.addCommand(&flyCommand);
    invoker.addCommand(&eatCommand);

    invoker.executeCommands();

    return 0;
}
/*
Output:
Sparrow is flying.
Sparrow is eating.
*/
相关推荐
梓䈑3 小时前
【算法题攻略】BFS 解决FloodFill 算法、最短路问题、多源BFS 和 拓扑排序
c++·算法·宽度优先
程序喵大人7 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng8 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
wdfk_prog9 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕9 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫9 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通10 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
AC赳赳老秦11 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
qq_25183645712 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
野生风长12 小时前
C++入门基础:从命名空间到引用与指针的全面解析
开发语言·c++