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