命令模式¶
英文: Command pattern.
描述¶
将请求封装为对象.
优点¶
- 将请求的操作与请求的接收者解耦, 比如: 并发编程分配任务给线程.
- 使得请求可以参数化被队列保存, 比如: 支持撤销操作(undoable operations).
缺点¶
- 如果命令种类繁多, 可能导致具体命令类数量过多.
实现¶
- 将请求已队列形式存储并支持撤销操作.
class Command {
public:
    virtual ~Command() = default;
    virtual void exec() = 0;
    virtual void undo() = 0;
};
class CommandQueue {
public:
    void exec(std::unique_ptr<Command> cmd) {
        assert(cmd != nullptr);
        undos.clear();
        cmd->exec();
        commands.emplace_back(std::move(cmd));
    }
    void undo() {
        assert(!commands.empty());
        commands.back()->undo();
        undos.emplace_back(std::move(commands.back()));
        commands.pop_back();
    }
    void redo() {
        assert(!undos.empty());
        undos.back()->exec();
        commands.emplace_back(std::move(undos.back()));
        undos.pop_back();
    }
private:
    std::vector<std::unique_ptr<Command>> commands; // 已执行的命令
    std::vector<std::unique_ptr<Command>> undos;    // 已撤销的命令
};