• 设计模式:命令模式(C++实现)


    命令模式(Command Pattern)是一种行为设计模式,它将请求封装成一个对象,从而使您可以使用不同的请求对客户端进行参数化。这使得客户端可以独立于具体的请求和接收者对请求进行操作。
    以下是一个简单的C++命令模式的示例:

    #include 
    #include 
    
    // 命令接口
    class Command
    {
    public:
        virtual void execute() = 0;
    };
    
    // 接收者类
    class Receiver
    {
    public:
        void action()
        {
            std::cout << "Receiver is doing something." << std::endl;
        }
    
        void play()
        {
            std::cout << "Receiver is playing." << std::endl;
        }
    };
    
    // 具体命令类
    class ConcreteCommand : public Command
    {
    private:
        // 接收者对象
        Receiver *receiver;
    
    public:
        ConcreteCommand(Receiver *receiver)
        {
            this->receiver = receiver;
        }
        void execute() override
        {
            receiver->action();
        }
    };
    
    // 具体命令类
    class PlayCommand : public Command
    {
    private:
        // 接收者对象
        Receiver *receiver;
    
    public:
        PlayCommand(Receiver *receiver)
        {
            this->receiver = receiver;
        }
        void execute() override
        {
            receiver->play();
        }
    };
    
    // 调用者类
    class Invoker
    {
    private:
        std::vector<Command *> commands;
    
    public:
        void addCommand(Command *command)
        {
            commands.push_back(command);
        }
        
        void executeCommands()
        {
            for (auto command : commands)
            {
                command->execute();
            }
            commands.clear();
        }
    };
    
    int main()
    {
        Invoker invoker;
        Receiver receiver;
    
        Command *command = new ConcreteCommand(&receiver);
        invoker.addCommand(command);
        invoker.executeCommands(); // 调用命令对象的execute()函数
    
        command = new PlayCommand(&receiver);
        invoker.addCommand(command);
        invoker.executeCommands(); // 调用命令对象的execute()函数
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97

    在上述示例中,Command是命令的基类,定义了一个纯虚函数execute(),用于执行命令。ConcreteCommand是具体的命令类,它包含了一个指向接收者对象的指针,并实现了execute()函数,将请求委托给接收者的action()函数进行处理。
    Receiver是接收者类,它定义了真正执行请求的操作,即action()函数。
    Invoker是调用者类,它维护一个命令对象的列表,并提供了addCommand()和executeCommands()函数。addCommand()用于向命令列表中添加命令对象,executeCommands()用于执行命令列表中的所有命令。
    在main()函数中,创建了一个调用者对象invoker和一个接收者对象receiver。然后创建了一个具体的命令对象command,并将其添加到调用者的命令列表中。通过调用executeCommands()函数,调用者会依次执行命令列表中的命令。
    通过命令模式,客户端可以将请求封装成命令对象,从而将请求发送者和请求接收者解耦。这样,可以灵活地组合和操作不同的请求。命令模式还支持撤销、重做等功能的实现。

  • 相关阅读:
    南大通用GBase 8a MPP Cluster管理工具简介
    一个来自内蒙 正式工作两年的攻城狮的独白以及总结
    如何使用 FastAPI 部署 NLP 模型?
    3.Vue从入门到精通 (第三章 使用Vue脚手架)
    【力扣 - 盛最多水的容器】
    数据库-jdbc、spring-jdbc、spring-boot-starter-jdbc
    力扣377---组合总和IV(Java、动态规划、中等题)
    分享:大数据信用报告查询的价格一般要多少钱?
    学习笔记-FRIDA脚本系列(二)
    小白必看!画出自己第一个界面,PyQt5安装以及使用
  • 原文地址:https://blog.csdn.net/wydxry/article/details/133034738