您的位置:首页 > 编程语言 > C语言/C++

设计模式C++描述----17.备忘录(Memento)模式

2013-06-28 16:38 423 查看
一. 备忘录模式

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

结构图:

 


使用范围:

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

代码:

[cpp] //备忘录类  

//负责存储 Originator 对象的内部状态  

class Memento  



//注意:备忘录类中的方法是私有的!!!!!!!  

private:  

    //这是最关键的地方,将 Originator 为friend类  

    //这样 Originator 就可以访问 Memento 类的内部信息  

    friend class Originator;  

 

    Memento() {} 

 

    Memento(const string& sdt) 

    { 

        _sdt = sdt; 

    } 

 

    void SetState(const string& sdt) 

    { 

        _sdt = sdt; 

    } 

                      

    string GetState() 

    { 

        return _sdt; 

    } 

 

private: 

    string _sdt; 

 

}; 

 

//原始类  

//负责创建备忘录  

class Originator  



public:  

    Originator() 

    { 

        _sdt = ""; 

        _mt = 0;  

    } 

 

    Originator(const string& sdt) 

    { 

        _sdt = sdt;       

        _mt = 0;  

    } 

 

    //创建备忘录,将当前信息保存在一个备忘录对象中  

    Memento* CreateMemento() 

    { 

        return new Memento(_sdt);  

    } 

 

    //恢复备忘录,将备忘录对象上的信息恢复出来  

    void RestoreToMemento(Memento* mt) 

    { 

        this->_sdt = mt->GetState(); 

    } 

 

    string GetState() 

    { 

        return _sdt; 

    } 

 

    void SetState(const string& sdt) 

    { 

        _sdt = sdt;  

    } 

 

    void PrintState() 

    { 

        cout<<this->_sdt<<"....."<<endl;  

    } 

 

private:  

    string _sdt; 

    Memento* _mt;  

}; 

                  

 

//测试代码  

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



    Originator* o = new Originator(); 

 

    o->SetState("old"); //备忘以前的状态  

    o->PrintState(); 

 

    Memento* m = o->CreateMemento(); //创建一个备忘录  

    o->SetState("new"); //修改状态 www.2cto.com   

    o->PrintState(); 

 

    o->RestoreToMemento(m); //恢复修改前的状态  

    o->PrintState(); 

 

    return 0; 



//备忘录类

//负责存储 Originator 对象的内部状态

class Memento

{

//注意:备忘录类中的方法是私有的!!!!!!!

private:

 //这是最关键的地方,将 Originator 为friend类

 //这样 Originator 就可以访问 Memento 类的内部信息

 friend class Originator;

 Memento() {}

 Memento(const string& sdt)

 {

  _sdt = sdt;

 }

 void SetState(const string& sdt)

 {

  _sdt = sdt;

 }

     

 string GetState()

 {

  return _sdt;

 }

private:

 string _sdt;

};

//原始类

//负责创建备忘录

class Originator

{

public:

 Originator()

 {

  _sdt = "";

  _mt = 0;

 }

 Originator(const string& sdt)

 {

  _sdt = sdt;  

  _mt = 0;

 }

 //创建备忘录,将当前信息保存在一个备忘录对象中

 Memento* CreateMemento()

 {

  return new Memento(_sdt);

 }

 //恢复备忘录,将备忘录对象上的信息恢复出来

 void RestoreToMemento(Memento* mt)

 {

  this->_sdt = mt->GetState();

 }

 string GetState()

 {

  return _sdt;

 }

 void SetState(const string& sdt)

 {

  _sdt = sdt;

 }

 void PrintState()

 {

  cout<<this->_sdt<<"....."<<endl;

 }

private:

 string _sdt;

 Memento* _mt;

};

    

//测试代码

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

{

 Originator* o = new Originator();

 o->SetState("old"); //备忘以前的状态

 o->PrintState();

 Memento* m = o->CreateMemento(); //创建一个备忘录

 o->SetState("new"); //修改状态

 o->PrintState();

 o->RestoreToMemento(m); //恢复修改前的状态

 o->PrintState();

 return 0;

}

 

二. 说明

1. Memento 负责存储 Originator 对象的内部状态,并可防止 Originator 以外的其它对象访问备忘录(具体实现方法,就是让其所有方法都为私有的)。

2. Memento 声明 Originator 为它的友元类,这样 Originator 就可以访问它的所有函数,即对 Originator 是开放的。

我觉得,私有和友元是备忘录模式实现的关键!

 

转载:http://blog.csdn.net/lwbeyond/article/details/7572707
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: