zoukankan      html  css  js  c++  java
  • C++设计模式-Memento备忘录模式

    Memento模式
    作用:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。

    UML图



    Originator:负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。

    Memento:负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。

    Caretaker:负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查。

    Memento模式中封装的是需要保存的状态,当需要恢复的时候才取出来进行恢复.原理很简单,实现的时候需要注意一个地方:窄接口和宽接口.所谓的宽接口就是一般意义上的接口,把对外的接口作为public成员;而窄接口反之,把接口作为private成员,而把需要访问这些接口函数的类作为这个类的友元类,也就是说接口只暴露给了对这些接口感兴趣的类,而不是暴露在外部.下面的实现就是窄实现的方法来实现的.

    Memento模式比较适用于功能比较复杂的,但需要维护或记录历史属性的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。

    如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。

    代码如下

    Memento.h

     1 #ifndef _MEMENTO_H_
     2 #define _MEMENTO_H_
     3 #include <string>
     4 
     5 using namespace std;
     6 
     7 //负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。
     8 //备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。
     9 class Memento
    10 {
    11 private:
    12     //将Originator为friend类,可以访问内部信息,但是其他类不能访问
    13     friend class Originator;
    14     Memento(const string& state);
    15     ~Memento();
    16     void SetState(const string& state);
    17     string GetState();
    18     string _state;
    19 };
    20 
    21 //负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态
    22 class Originator
    23 {
    24 public:
    25     Originator();
    26     Originator(const string& state);
    27     ~Originator();
    28     void RestoreToMemento(Memento* pMemento);
    29     Memento* CreateMemento();
    30     void SetState(const string& state);
    31     string GetState();
    32     void show();
    33 protected:
    34 private:
    35     string _state;
    36 };
    37 
    38 //负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查
    39 class Caretaker
    40 {
    41 public:
    42     Caretaker();
    43     ~Caretaker();
    44     void SetMemento(Memento*);
    45     Memento* GetMemento();
    46 private:
    47     Memento* _memento;
    48 };
    49 
    50 #endif

    Memento.cpp

     1 #include "Memento.h"
     2 #include <iostream>
     3 #include <string>
     4 
     5 using namespace std;
     6 
     7 Memento::Memento(const string& state)
     8 {
     9     this->_state = state;
    10 }
    11 
    12 Memento::~Memento()
    13 {}
    14 
    15 string Memento::GetState()
    16 {
    17     return this->_state;
    18 }
    19 
    20 void Memento::SetState(const string& state)
    21 {
    22     this->_state = state;
    23 }
    24 
    25 Originator::Originator()
    26 {}
    27 
    28 Originator::Originator(const string& state)
    29 {
    30     this->_state = state;
    31 }
    32 
    33 Originator::~Originator()
    34 {}
    35 
    36 string Originator::GetState()
    37 {
    38     return this->_state;
    39 }
    40 
    41 void Originator::show()
    42 {
    43     cout << this->_state << endl;
    44 }
    45 
    46 void Originator::SetState(const string& state)
    47 {
    48     this->_state = state;
    49 }
    50 
    51 Memento* Originator::CreateMemento()
    52 {
    53     return new Memento(this->_state);
    54 }
    55 
    56 void Originator::RestoreToMemento(Memento* pMemento)
    57 {
    58     this->_state = pMemento->GetState();
    59 }
    60 
    61 Caretaker::Caretaker()
    62 {}
    63 
    64 Caretaker::~Caretaker()
    65 {}
    66 
    67 Memento* Caretaker::GetMemento()
    68 {
    69     return this->_memento;
    70 }
    71 
    72 void Caretaker::SetMemento(Memento* pMemento)
    73 {
    74     this->_memento = pMemento;
    75 }

    main.cpp

     1 #include "Memento.h"
     2 
     3 int main()
     4 {
     5     //初始化对象,状态为“Old”
     6     Originator* o = new Originator("Old");
     7     o->show();
     8 
     9     //建立并保存Memento
    10     Caretaker* pTaker = new Caretaker();
    11     pTaker->SetMemento(o->CreateMemento());
    12 
    13     //改变状态
    14     o->SetState("New");
    15     o->show();
    16 
    17     //恢复状态
    18     o->RestoreToMemento(pTaker->GetMemento());
    19     o->show();
    20 
    21     return 0;
    22 }

    结果如下:

  • 相关阅读:
    hiveserver2 with kerberos authentication
    python Basic usage
    python Quicksort demo
    Python HeapSort
    mrunit for wordcount demo
    CCDH证书
    Hadoop question list
    Hadoop Yarn core concepts
    Hadoop Resource
    Hadoop could not find or load main class
  • 原文地址:https://www.cnblogs.com/jiese/p/3183764.html
Copyright © 2011-2022 走看看