Tutorial 20_备忘录模式

发布时间 2023-11-23 23:13:49作者: 花伤错零

实验 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;
        }
        }