備忘錄模式

定義:

  備忘錄模式(Memento Pattern)在一個對象之外保存這個對象的某些狀態,以便在適當的時候恢復對象。備忘錄模式屬於行為型模式。

結構圖: 

 

 

程式碼:

//Originator類

class Originator

{

private:

   String state;

public:

  void setState(String state)

  {

    this.state = state;

  }

  //創建一個備忘錄並保存狀態

  Memento* CreateMemento()

  {

    return (new Memento(state));

  }

  //恢復狀態

  void SetMemento(const Memento& cMemento )

  {

    state = cMemento.getstate();

  }

}

//Memento類

class Memento

{

private:

   String state;

public:

  Memento(String state)

  {

    this.state = state;

  }

  //恢復方法

  String* getstate()

  {

    return this.state;

  }

}

//Memento類(管理者)為了符合迪米特原則

class CareTaker

{

private:

  Memento* pMemento;

public:

  void SetMemento(pMemento* pMemento)

  {

    this.pMemento = pMemento;

  }

}

//客戶端 

Originator cOriginator;

cOriginator.setState(“ok”);//設置狀態:ok

CareTaker cCareTaker;

cCareTaker.SetMemento(cOriginator.CreateMemento);//保存狀態給管理者

cOriginator.setState(“notok”);//設置狀態為:notok

cOriginator.SetMemento(cCareTaker.pMemento);//恢復狀態為ok

 

使用時機:

  需要維護或者記錄歷史屬性的類;

  需要保存部分屬性時(全部屬性請考慮原型模式);

 

優點:

1、給用戶提供了一種可以恢復狀態的機制,可以使用戶能夠比較方便地回到某個歷史的狀態。

2、實現了資訊的封裝,使得用戶不需要關心狀態的保存細節。

 

缺點:如果需要備份的狀態數據很大,會非常消耗記憶體資源。