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