温馨提示×

c++命令模式怎样实现

c++
小樊
84
2024-12-03 23:36:38
栏目: 编程语言

C++中的命令模式(Command Pattern)是一种行为设计模式,它允许你将一个请求封装为一个对象,从而使你可以使用不同的请求、队列或日志请求,并支持可撤销的操作。命令模式通常包括以下几个角色:

  1. 命令接口(Command):声明执行操作的接口。
  2. 具体命令(Concrete Command):实现了命令接口,通常包含一个接收者对象,并调用接收者的功能来完成命令要执行的操作。
  3. 接收者(Receiver):执行与执行命令相关的操作。任何类都可能成为一个接收者,只要它能够根据命令要求实现的相应功能。
  4. 调用者(Invoker):要求该命令执行这个请求。调用者并不知道接收者是谁,也不知道命令是怎么执行的,它只知道有一个命令接口可以调用。
  5. 客户端(Client):创建具体命令对象,并设置其接收者。

下面是一个简单的C++命令模式的实现示例:

#include <iostream>
#include <vector>

// 命令接口
class Command {
public:
    virtual ~Command() {}
    virtual void execute() = 0;
};

// 接收者
class Light {
public:
    void turnOn() {
        std::cout << "Light turned on." << std::endl;
    }

    void turnOff() {
        std::cout << "Light turned off." << std::endl;
    }
};

// 具体命令 - 打开灯
class TurnOnCommand : public Command {
private:
    Light* light;
public:
    TurnOnCommand(Light* light) : light(light) {}
    void execute() override {
        light->turnOn();
    }
};

// 具体命令 - 关闭灯
class TurnOffCommand : public Command {
private:
    Light* light;
public:
    TurnOffCommand(Light* light) : light(light) {}
    void execute() override {
        light->turnOff();
    }
};

// 调用者
class RemoteControl {
private:
    std::vector<Command*> commands;
public:
    void addCommand(Command* command) {
        commands.push_back(command);
    }

    void executeCommands() {
        for (auto& command : commands) {
            command->execute();
        }
    }
};

// 客户端
int main() {
    Light light;
    TurnOnCommand turnOn(&light);
    TurnOffCommand turnOff(&light);

    RemoteControl remoteControl;
    remoteControl.addCommand(&turnOn);
    remoteControl.addCommand(&turnOff);

    remoteControl.executeCommands();

    return 0;
}

在这个示例中,我们创建了一个简单的灯(Light)类,它有两个方法:打开(turnOn)和关闭(turnOff)。然后我们创建了两个具体命令类:TurnOnCommand 和 TurnOffCommand,它们分别实现了命令接口(Command),并在执行方法中调用了 Light 类的相应方法。RemoteControl 类作为调用者,它接收并存储命令对象,然后遍历执行这些命令。在客户端代码中,我们创建了一个 Light 对象和两个具体命令对象,并将它们添加到 RemoteControl 对象中,最后执行这些命令。

0