设计模式之- 备忘录模式(Memento Pattern)

Posted j1ac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之- 备忘录模式(Memento Pattern)相关的知识,希望对你有一定的参考价值。

备忘录模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
C++实现代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;


class memento{//用于记录状态的类
    string state;
public:
    memento(string s){
        state = s;
    }
    string getState(){
        return state;
    }
};


class originator{//当前状态类
    string state;
public:
    void setState(string s){
        state = s;
    }
    string getState(){
        return state;
    }
    memento *saveStateToMemento(){
        return new memento(state);
    }
    void getStateFromMemento(memento * m){
        state =  m->getState();
    }
};


class CareTaker{//管理过去状态的类
public:
    vector<memento*> mementoList;

    void add(memento* m){
        mementoList.push_back(m);
    }
    memento * get(int index){
        return mementoList[index];
    }
    memento * getLast(){
        if(mementoList.empty()) return nullptr;
        else{
            memento* temp = mementoList.back();
            mementoList.pop_back();
            return temp;
        }
    }
};



class MementoPatternDemo{
public:
    static void method(){
        originator * ori = new originator();
        CareTaker * ct = new CareTaker();
        ori->setState("State #1");
        ori->setState("State #2");
        ct->add(ori->saveStateToMemento());
        ori->setState("State #3");
        ct->add(ori->saveStateToMemento());
        ori->setState("State #4");

        cout<<"Current state:"<<ori->getState()<<endl;
        memento * lastState;
        while(lastState = ct->getLast()){
            ori->getStateFromMemento(lastState);
            cout<<"Last state is:"<<ori->getState()<<endl;
        }
        // ori->getStateFromMemento(ct->get(0));
        // cout<<"Current state:"<<ori->getState()<<endl;
        // ori->getStateFromMemento(ct->get(1));
        // cout<<"Current state:"<<ori->getState()<<endl;
    }
};


int main(){
    MementoPatternDemo::method();
}

类图:

技术分享图片

 

在上一次面试中考到了、、、当时没答出来,感觉这个设计模式还是挺有用的,特别是在编辑器或者整个流程之中有undo,redo等需要记录过程状态时。

以上是关于设计模式之- 备忘录模式(Memento Pattern)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之- 备忘录模式(Memento Pattern)

23种设计模式之备忘录模式(Memento)

秒懂设计模式之备忘录模式(Memento Pattern)

设计模式之备忘录模式

学习日记之备忘录模式和继承面向对象设计

22行为型模式之备忘录模式