Memento

4519 ワード

#include <iostream>

#include <string>



using namespace std;





class Memento

{

public:

    Memento(string sState) { m_sState = sState; }

    

    string GetState() { return m_sState; }

    void SetState(string sState) { m_sState = sState; }

    

private:

    string m_sState;

};



class Originator

{

public:

    Originator() : m_memento("") {}

    

    void Executor(string sDo)

    {

        cout<<sDo<<endl;

    }



    void SetSate(const Memento& memento) { m_memento = memento; cout<<"current state:"<<m_memento.GetState()<<endl; }

    Memento CurrentState()

    {

        return m_memento;

    }



private:

    Memento m_memento;

};







class Caretaker

{

public:

    Caretaker() : m_backupMemento("") { m_executor.SetSate(Memento("Initial state")); }

    

    void Begin()

    {

        m_backupMemento = m_executor.CurrentState();

        m_executor.SetSate(Memento("ready for transaction"));

        m_executor.Executor("begin transaction...");

    }

        

    void Rollback()

    {

        m_executor.SetSate(Memento("rollback transaction"));

        m_executor.Executor("rollback...");

        m_executor.SetSate(m_backupMemento);

    }

    

private:

    Originator m_executor;

    Memento m_backupMemento;

};







int main(int argc, char *argv[])

{

    Caretaker caretaker;

    caretaker.Begin();

    caretaker.Rollback();



    return 0;

}