码迷,mamicode.com
首页 > 其他好文 > 详细

备忘录模式

时间:2015-05-24 20:19:13      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

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

  类图:

技术分享

  适用性:

  • 必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
  • 如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

  效果:

  • 保持封装边界
  • 简化了原发器。原发器不用自己管理历史状态。
  • 使用备忘录可能代价很高。如果拷贝代价高或者频繁创建使用备忘录会使得备忘录代价变高。除非封装和恢复Originator状态的开销不大,否则该模式可能并不合适。
  • 定义窄接口和宽接口。可将Originator作为Memento的一个友元,并使宽接口为私有,窄接口为公共。
  • 维护备忘录的潜在代价。管理器负责删除它所维护的备忘录,但是管理器并不知道备忘录的内部,因此开销就不知道有多少。

  模板代码:

#include <iostream>
#include <string>
using namespace std;

class Originator;

class Memento {
public:
    ~Memento() {}
private:
    friend class Originator;
    Memento() { m_state = "NULL"; }
    void setState(string state) { m_state = state; }
    string getState() { return m_state; }
private:
    string m_state;
};

class Originator {
public:
    Memento* createMemento() { return new Memento(); }
    void setMemento(Memento* memento) { m_state = memento->getState(); }
public:
    void setState(string state) { m_state = state; }
    string getState() { return m_state; }
private:
    string m_state;
};



class CareTaker {
public:
    Memento* getMemento() { return m_pMemento; }
    void setMemento(Memento* pMemento) { m_pMemento = pMemento; }
    ~CareTaker() { delete m_pMemento; }
private:
    Memento* m_pMemento;
};

int main() {
    Originator o;
    o.setState("ON");
    cout << "o state : " << o.getState() << endl;

    CareTaker c;
    c.setMemento(o.createMemento());

    o.setState("OFF");
    cout << "o state : " << o.getState() << endl;

    o.setMemento(c.getMemento());
    cout << "o state : " << o.getState() << endl;


    return 0;
}

  小结:当你需要某类的历史状态,可以考虑使用备忘录模式。备忘录模式就是维护某类的历史状态,利用CareTaker封装备份与恢复的细颗粒操作。

备忘录模式

标签:

原文地址:http://www.cnblogs.com/programmer-kaima/p/4526258.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!