实验 20:备忘录模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解备忘录模式的动机,掌握该模式的结构;
2、能够利用备忘录模式解决实际问题。
[实验任务一]:多次撤销
改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以使用HashMap、ArrayList等集合数据结构实现)。
实验要求:
1. 提交源代码;
2. 注意编程规范。
#include <iostream> #include <string> #include <vector> using namespace std; class AbstractCommand { public: virtual int execute(int value) = 0; virtual int undo() = 0; }; class Adder { public: int num = 0; int add(int value) { num += value; return num; }; }; class ConcreteCommand :public AbstractCommand { public: Adder* adder = new Adder(); vector<int>* list; ConcreteCommand() { this->list = new vector<int>; }; int execute(int value) { list->push_back(value); return adder->add(value); }; int undo() { if (list->size() > 0) { int value = list->at(list->size() - 1); list->pop_back(); return adder->add(-value); } else { return 0; } }; }; class CalculatorForm { public: AbstractCommand* command; void setCommand(AbstractCommand* command) { this->command = command; }; void compute(int value) { int i = command->execute(value); cout << "执行运算,运算结果为:" << i << endl; } void undo() { int i = command->undo(); cout << "执行撤销,运算结果为:" << i << endl; } }; int main() { CalculatorForm* form = new CalculatorForm(); ConcreteCommand* command = new ConcreteCommand(); form->setCommand(command); bool flag = true; while (flag) { cout << "请输入想要操作的选项,1为计算,-1为撤销,0为退出" << endl; int n; cin >> n; switch (n) { case 1: cout << "请输入想要添加的数值" << endl; int m; cin >> m; form->compute(m); break; case -1: form->undo(); break; case 0: flag = false; break; default: cout << "输入错误请重新输入!!\n"; break; } }