設計模式之備忘錄模式Memento

設計模式之備忘錄模式Memento

適用範圍:

在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。

實例:如遊戲玩家在殺一大怪時,可以進行備份操作,失敗後從備份點重新來做。

備忘錄模式結構圖如下所示:

 

C++代碼實現如下所示:

1、備忘錄CMemento的實現

//Memento.h

#include <string>

using namespace std;

 

Class Memento

{

public:

    Memento(string state);

    virtual ~Memento();

    void SetState(string state);

    string GetState();

 

private:

    string m_state;

}

 

//Memento.cpp

#include "Memento.h"

CMemento::CMemento(string state)

{

    m_state = state;

}

 

CMemento::~CMemento()

{

}

 

void CMemento::SetState(string state)

{

    m_state = state;

}

 

string CMemento::GetState()

{

    return m_state;

}

 

2、備份類CCaretaker

//Caretaker.h

#include "Memento.h"

 

Class CCaretaker

{

public:

    CCaretaker();

    virtual ~CCaretaker();

    void SetMemento(CMemento *m);

    CMemento *GetMemento();

 

private:

   CMemento *m_memento;

}

 

//Caretaker.cpp

#include "Caretaker.h"

 

CCaretaker::CCaretaker()

{
}

 

CCaretaker::~CCaretaker()

{

}

 

void CCaretaker::SetMemento(CMemento *m)

{

   m_memento = m;

}

 

CMemento *CCaretaker::GetMemento()

{

   return m_menmento;

}

 

3、COrigitor的實現:

 

Class COrigitor

{

public:

    COrigitor();

    virtual ~COrigitor();

    void SetState(string state);

    string GetState();

    void SetMemento(CMemento *m);

    CMemento *GetMemento();

    void Show();

private:

    string state;

 

}

 

//Origitor.cpp

#include "Origitor.h"

 

COrigitor::COrigitor()

{

}

 

COrigitor::~COrigitor()

{

}

 

void COrigitor::SetState(string state)

{

    m_state = state;

}

 

string COrigitor::GetState()

{

    return m_state;

}

 

void COrigitor::SetMemento(CMemento *m)

{

  m_state = m->GetState();

}

 

CMemento *COrigitor::CreateMemento()

{

   return new CMemento(m_state);

}

 

 

void CMemento::Show()

{

    cout<<m_state<<endl;

}

 

4、客戶端代碼main.cpp

#include <iostream.h>

#include "Memento.h"

#include "Caretaker.h"

#include "Origitor.h"

#include <string>

using namespace std;

 

COrigitor o;

o.SetState("ON");

cout<<"初始化時狀態:";

o.Show();

 

//備份

CCaretaker care;

 CMemento *m = o.CreateMemento();

care.SetMemento(m);

 

o.SetState("OFF");

cout<<"修改後狀態:";

o.Show();

 

//恢復狀態

o.SetMemento(care.GetMemento());

cout<<"恢復後的狀態:";

o.Show();

 

//釋放內存

if(m != NULL)

{

   delete m;

}

 

以上,僅供參考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章