命令模式将请求封装为对象,实现发送者与接收者的解耦,支持撤销、重做和延迟执行;在C++中通过Command接口、具体命令、接收者、调用者和客户端协作完成,可用于GUI操作、事务管理等场景。

命令模式是一种行为设计模式,它将请求封装成对象,从而使你可以用不同的请求、队列、日志记录来参数化其他对象。在C++中实现命令模式,能有效解耦发送者和接收者,并支持撤销、重做、延迟执行等高级功能。
命令模式的关键在于把“操作”变成一个对象——即命令对象。这个对象知道要执行什么操作、由谁来执行,并可以触发执行。这样,调用方不需要了解具体执行逻辑,只需要持有命令对象并调用其执行方法即可。
主要角色包括:
下面是一个简单的文本编辑器中的“打开文件”和“保存文件”命令的实现:
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <string>
#include <stack>
<p>// 接收者:处理实际操作
class TextEditor {
public:
void openFile(const std::string& filename) {
std::cout << "打开文件: " << filename << "\n";
}</p><pre class='brush:php;toolbar:false;'>void saveFile() {
std::cout << "保存当前文件\n";
}};
// 命令基类 class Command { public: virtual ~Command() = default; virtual void execute() = 0; virtual void undo() = 0; };
// 具体命令:打开文件 class OpenFileCommand : public Command { private: TextEditor* editor; std::string filename;
public: OpenFileCommand(TextEditor* e, const std::string& f) : editor(e), filename(f) {}
void execute() override {
editor->openFile(filename);
}
void undo() override {
std::cout << "关闭文件: " << filename << "\n";
}};
// 具体命令:保存文件 class SaveFileCommand : public Command { private: TextEditor* editor;
public: SaveFileCommand(TextEditor* e) : editor(e) {}
void execute() override {
editor->saveFile();
}
void undo() override {
std::cout << "撤销保存操作\n";
}};
// 调用者:按钮或快捷键 class Button { private: Command* command;
public: void setCommand(Command* cmd) { command = cmd; }
void click() {
if (command) command->execute();
}};
命令模式的强大之处在于能轻松实现撤销和重做。通过维护一个命令栈,每执行一个命令就压入栈中,撤销时弹出并调用undo()方法。
class CommandHistory {
private:
std::stack<Command*> history;
<p>public:
void push(Command* cmd) {
history.push(cmd);
}</p><pre class='brush:php;toolbar:false;'>void undo() {
if (!history.empty()) {
Command* cmd = history.top();
history.pop();
cmd->undo();
}
}};
使用方式:
int main() {
TextEditor editor;
CommandHistory history;
<pre class='brush:php;toolbar:false;'>OpenFileCommand openCmd(&editor, "main.cpp");
SaveFileCommand saveCmd(&editor);
Button openBtn, saveBtn;
openBtn.setCommand(&openCmd);
saveBtn.setCommand(&saveCmd);
openBtn.click(); // 执行:打开文件
saveBtn.click(); // 执行:保存文件
history.push(&openCmd);
history.push(&saveCmd);
history.undo(); // 撤销保存
history.undo(); // 撤销打开
return 0;}
使用命令模式带来的好处:
常见应用场景包括GUI按钮、菜单项、事务系统、操作日志、远程方法调用等。
基本上就这些。命令模式通过把“动作”变成对象,让程序结构更灵活,也更容易支持复杂交互逻辑。关键是设计好命令接口和管理好生命周期,避免悬空指针问题。使用智能指针(如std::shared_ptr)可以进一步提升安全性。
以上就是C++如何实现一个命令模式_C++将请求封装成对象以实现解耦和可撤销操作的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号