C++設計模式---備忘錄模式

來源:互聯網
上載者:User

備忘錄模式(Memento):在不破壞封裝性的前提下,捕獲一個對象內部狀態,並在該對象之外儲存這個狀態。這樣以後就可以將該對象恢複到原先儲存的狀態。

 

備忘錄模式結構圖:

 

 

Originator(發起人):負責建立一個備忘錄Memento,用以記錄當前時刻它的內部狀態,並可使用備忘錄恢複內部狀態。Originator可根據需要決定Memento儲存Originator的哪些內部狀態。

Memento(備忘錄):負責儲存Originator對象的內部狀態,並可防止Originator以外的其他對象訪問備忘錄Memento。備忘錄有兩個介面,Caretaker只能看到備忘錄的窄介面,它的能將備忘錄傳遞給其他對象。Originator能夠看到一個寬介面,允許它訪問返回到先前狀態所需要的所有資料。

Caretaker(管理者):負責儲存備忘錄Memento,不能對備忘錄的內容進行操作或檢查。

 

備忘錄模式基本代碼:

 

發起人(Originator)類:

 

class Originator

{

 private:

    String  state;

 public:

    String  getState()

    {

          return state;

    }

     void  setState(String  state)

    {

            this->state=state;

     }

 

     Memento * CreateMemento()

     {

          return  (new  Memento(state))

     }

  

     void  SetMemento(Memento * memento)

     {

          this->state = memento->state;

     }

    

     void  Show()

     {

           cout<< “目前狀態:”<<state<<endl;

     }

};

 

 

備忘錄(Memento)類:

 

class Memento

{

 private:

    String  state;

 public:

    Memento(String  state)

    {

         this->state=state;

    }

    String  getState()

    {

         return state;

    }

};

 

 

管理者(Caretaker)類:

 

class Caretaker

{

 private:

    Memento  *memento;

public:

  Memento * getMemento()

   {

        return this->memento;

   }

   void  setMemento(Memento * memento)

   {

        this->memento = memento;

   }

};

 

 

用戶端程式:

 

void main()

{

    Originator * o = new Originator(); //Originator初始狀態,狀態屬性為“On”

    o->setState(“On”);

    o->Show();

    

    Caretaker *c= new Caretaker();

    c->setMemento(o->CreateMemento);

    o->setState(“off”);            //Originator改變了狀態屬性為“Off”

    o->Show();

    

    o->setMemento(c->getMemento());  //恢複原始狀態

    o->Show();

 }

 

總結:

   把要儲存的細節給封裝在Memento中

  Memento模式比較適用於功能比較複雜的,但需要維護或記錄屬性曆史的類,或者需要儲存的屬性只是眾多屬性中的一小部分時,Originator可以根據儲存的Memento資訊還原到前一個狀態。

如果在某個系統中使用命令模式時,需要實現命令的撤銷功能,那麼命令模式可以使用備忘錄模式來儲存可撤銷操作的狀態。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.