备忘录模式C++

备忘录模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

备忘录模式结构图

备忘录模式C++_第1张图片
image

备忘录模式基本代码

#include 
#include 
using namespace std;

class Memento { // 备忘录
private:
    string state;
public:
    Memento(string s) { state = s; }
    string GetState() { return state; }
    void SetState(string s) { state = s; }
};

class Caretaker { // 管理者
private:
    Memento* menento;
public:
    // Caretaker(Memento* m) { menento = m; }
    Memento* GetMemento() { return menento; }
    void SetMemento(Memento* m) { menento = m; }
    ~Caretaker() { delete menento; }
};

class Originator { // 发起人
private:
    string state; // 需要保存的属性
public:
    string GetState() { return state; }
    void SetState(string s) { state = s; }
    Memento* CreateMemento() { return new Memento(state); } // 创建备忘录对象,保存信息
    void SetMemento(Memento* m) { state = m->GetState(); }  // 恢复备忘录
    void Show() { cout << "state: " << state << endl; }
};

int main() {
    Originator* o = new Originator();
    o->SetState("On");
    o->Show();   // state: On

    Caretaker* c = new Caretaker();
    c->SetMemento(o->CreateMemento());   // 保存状态

    o->SetState("Off");
    o->Show();   // state: Off

    o->SetMemento(c->GetMemento()); // 恢复初始状态
    o->Show();   // state: On

    delete o;
    delete c;
    return 0;
}

应用场景

Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。

你可能感兴趣的:(备忘录模式C++)