C++备忘录模式(Memento)

 C++
时间:

使用场景

1、需要保存/恢复数据的相关状态场景。
2、提供一个可回滚的操作。

Memento

  • Memento.h
#ifndef __MEMENTO_H__
#define __MEMENTO_H__
#include<iostream>

using namespace std;

class Memento;

class Originator
{
    public:
        typedef string State;
        Originator();
        Originator(const State& std);
        ~Originator();
        Memento* CreateMemento();
        void SetMemento(Memento* men);
        void RestoreToMemento(Memento* mt);
        State GetState();
        void SetState(const State& sdt);
        void PrintState();
    protected:
    private:
        State _sdt;
        Memento* _mt;
};

class Memento
{
    public:
    protected:
    private:
        friend class Originator;
        typedef string State;
        Memento();
        Memento(const State& sdt);
        ~Memento();
        void SetState(const State& sdt);
        State GetState();

    private:
        State _sdt;
};

#endif
  • Memento.cpp
#include<iostream>
#include"Memento.h"
typedef string State;

Originator::Originator()
{
    _sdt = "";
    _mt = 0;
}
Originator::Originator(const State& sdt)
{
    _sdt = sdt;
    _mt = 0;
}
Originator::~Originator() {}

Memento* Originator::CreateMemento()
{
    return new Memento(_sdt);
}

void Originator::SetMemento(Memento* men)
{

}

void Originator::RestoreToMemento(Memento* mt)
{
    this->_sdt = mt->GetState();
}

State Originator::GetState()
{
    return _sdt;
}

void Originator::SetState(const State& sdt)
{
    _sdt = sdt;
}

void Originator::PrintState()
{
    cout << this->_sdt << "......" << endl;
}

Memento::Memento() {}

Memento::Memento(const State& sdt) { _sdt = sdt; }

Memento::~Memento(){}

void Memento::SetState(const State& sdt) { _sdt = sdt; }
State Memento::GetState() { return _sdt; }
  • main.c
#include<iostream>
#include"Memento.h"
using namespace std;


int main(int argc, char* argv[])
{
    Originator* o = new Originator();
    o->SetState("old");
    o->PrintState();
    Memento* m = o->CreateMemento();
    o->SetState("new");
    o->PrintState();
    o->RestoreToMemento(m);
    o->PrintState();
    return 0;
}

0 评论