跳转至

命令模式

英文: 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;    // 已撤销的命令
};

评论