命令模式——C++实现
问题描述:
某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次undo()和redo()操作,可以使用加法运算来模拟实现。
类图:
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | #include<iostream> #include<vector> #include<stack> using namespace std; //接受者 class Adder { private : int num; public : Adder(){ this ->num=0; } int add( int value) { num += value; return num; } }; //抽象命令 class Command { public : virtual int execute( int value) = 0; virtual int undo() = 0; virtual int redo() = 0; }; //具体命令 class AddCommand : public Command { private : Adder adder; stack < int >unStack; stack < int >reStack; public : int undo() { int i = 0; if (unStack.empty()) { i = -1; } else { reStack.push(unStack.top()); unStack.pop(); if (!unStack.empty()) { i = unStack.top(); } } return i; } int redo() { int i = 0; if (reStack.empty()) { i = -1; } else { //撤回时只要可以可以撤回,则撤回栈一定有数据 unStack.push(reStack.top()); i = reStack.top(); reStack.pop(); } return i; } int execute( int value) { int v = 0; v = adder.add(value); cout << v << endl; unStack.push(v); return v; } }; //调用者 class Invoker{ private : AddCommand command; public : void setCommand(AddCommand command2) { command = command2; }; void compute( int value) { command.execute(value); }; void undo() { int i = command.undo(); if (i == -1) { cout << "已撤销到初态" << endl; } else { cout << "执行成功,运算结果是:" << i << endl; } } void redo() { int i = command.redo(); if (i == -1) { cout << "已恢复至终态" << endl; } else { cout << "执行成功,运算结果是:" << i << endl; } } }; //测试函数 int main() { Invoker inv; AddCommand command; inv.setCommand(command); //计算 cout << "计算过程:" << endl; inv.compute(1); inv.compute(2); inv.compute(3); //多次撤回 cout << "undo操作:" << endl; inv.undo(); inv.undo(); inv.undo(); inv.undo(); //多次恢复 cout << "redo操作:" << endl; inv.redo(); inv.redo(); inv.redo(); inv.redo(); } |
运行截图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话