备忘录模式C++实现

1定义Memento pattern

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

2类图

3实现

class Originator

{

private:

  string state;

public:

  string getState();

  void setState(string &x);

  Memento creatMemento()

  {

    return new Memento(state);

  }

  void restoreMemento(Memento men)

  {

    setState(men.getState());

  }

};

class Memento

{

public:

  Memento(string st)

    :state(st)

  {}

  string getState()

  {

    return state;

  }

  void setState(string st)

  {

    state = st;

  }

};

//备忘录管理员角色

class Caretaker

{

private:

  Memento memento;

  Memento getMemento()

  {return memento;}

  void setMemento(string st)

  {memento = st;}

};

class Client
{

public:

  void operator()()

  {

    Originator or= new Originator();

    Caretaker ca = new Caretaker();

    //管理员备忘记录设置为用户定义为备忘状态

    ca.setMemento(or.createMemento());

    //用户重新会退到管理员记录的某一状态

    or.restoreMemento(ca.getMemento());

  }

};

4应用

使用场景

需要提供保存和恢复数据的相关状态场景

提供一个可回滚rollback操作

需要监控的副本场景。

数据库连接的事务管理就是备忘录模式

注意事项:

备忘录的声明期:作用在最近的代码。不使用就立即删除。..备忘录不是华佗在世,起死回生

备忘录的性能:不能用在for中,不能用频繁建立。消耗资源太多,这会是设计重构的前兆

5扩展

clone方式的备忘录

实现

class Originator :public Cloneable

{

private:

  string state;

public:

  void setState(string st);

  Originator creatorMemento()

  {

    return clone();

  }

  restoreMemento(Originator or)

  {

    setState(or.getState);

  }

  

  Originator clone()

  {

    //其实就是拷贝构造一个

  }

};

class Caretaker
{

private:

  Originator or;

  Originator getOriginator()

  {

    return or;

  }

  void setOriginator(Originator originator)

  {

    or = originator;

  }

}

既然可以合并备忘录角色,那么管理员也是可以合并的

class Originator :public Cloneable

{

private:

  Originator* _backup;

  string _state;

public:

  Originator(const Originator& or)

  {} 

  void setState();

  void creatMemento()

  {

    _bcakup = new Originator(*this);

  }

  void restoreMemento()

  {

    assert(_backup);

    setStat(_backup->getState);

  }

};

注:因为clone方式的备忘录可能会因为深浅拷贝问题而复杂,所以clone方式的备忘录适用简单的场景

②多状态备忘录

在Originator中封装多个状态,而Memento则保存一个HashMap 的state

③多备份的备忘录

注:管理员角色封装一的HashMap封装一个备忘录而非备忘状态

eg

class Caretaker

{

private:

  HashMap<string,Memento> memMap;

public:

  Memento getMemento(stirng index)

  {}

  void setMemento(string index,Memento me)

  {

    memMap.put(index,me);

  }

};

void Test

{

  Originator or = new Originator();

  Caretaker ca = new Caretaker();
  ca.setMemento("001",or.createMemento());
  ca.setMemento("002",or.createMemento());

  or.restoreMemento(ca.getMemento("001"));

}

注:该模式下应当注意备忘录上限,控制内存

提升:提供权限问题

class Originator

{

private:

  string state;

public:

  void setState(string st);

  Imemento createMemento()

  {

    return new Memento(state);

  }

  void restoreMemento(Imemento me)

  {

    setState(me.getState());

  }

private:

  //内置类,实现

  class Memento :public IMemento

  {

  private:

    string state;

    Memento(string st)

    {

      state = st;

    }

    string getState();

    void setState(string st);

  };

};

class Imemento

{

public: 

  virtual ~Imemento()=0;

};

class Caretaker

{

  Imemento memento;

public:

  Imemento getMemento()

  {

    return memento;

  }

  void setMemento(Imemento mem)

  {

    memento = mem;

  }

};

注:这里的设计方案:双接口设计,一个是业务的正常接口,实现必要的业务逻辑,宽接口;另一个则是空接口,什么方法都没有,目的是提供给子系统外的模块访问,窄接口。窄接口中没有任何操纵数据的方法,所以是相对安全的。

设计模式--备忘录模式C++实现的更多相关文章

  1. [转] Android中的设计模式-备忘录模式

    转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫 ...

  2. Java设计模式—备忘录模式

    个人感觉备忘录模式是一个比较难的设计模式,备忘录模式就是一个对象的备份模式,提供了一种程序数据的备份方法. 定义如下:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以 ...

  3. JAVA 设计模式 备忘录模式

    用途 备忘录模式 (Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态. 备忘录模式是一种行为型模式. 结构

  4. [工作中的设计模式]备忘录模式memento

    一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...

  5. 深入浅出设计模式——备忘录模式(Memento Pattern)

    模式动机 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取 ...

  6. IOS设计模式-备忘录模式

    内容大纲 如何存储记录 备忘录模式的基本原理 使用备忘录模式 优化存储方案 恢复UIView的状态 1.如何存储记录 在存储记录时,第一步我们需要用一把钥匙去打开一把锁.第二步,当我们打开锁之后就会有 ...

  7. PHP设计模式——备忘录模式

    声明:本系列博客參考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对 ...

  8. java设计模式---备忘录模式

    一.引子 俗话说:世上难买后悔药.所以凡事讲究个"三思而后行",但总常见有人做"痛心疾首"状:当初我要是--.如果真的有<大话西游>中能时光倒流的& ...

  9. C++设计模式——备忘录模式

    备忘录模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢 ...

  10. C#设计模式-备忘录模式

    访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而本文要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起人的具体命令(命令对应的是行为),而备忘 ...

随机推荐

  1. PATH_INFO, SCRIPT_NAME, REQUEST_URI区别示例

     

  2. django之路由(url)

    前言: Django大致工作流程 1.客户端发送请求(get/post)经过web服务器.Django中间件. 到达路由分配系统 2.路由分配系统根据提取 request中携带的的url路径(path ...

  3. Scala快速排序

    Scala 快排 Scala 基本思想:经过一趟排序,把待排对象分成两个独立的部分,一部分的数据大(小)于另一部分,同理,对子对象进行如此处理,以达到所有数据都有序.   package studen ...

  4. 【android】开发笔记系列UI篇

    弹出View添加阴影效果 系统自带就有,在android studio上直接写入背景颜色 android:background="@android:drawable/dialog_holo_ ...

  5. C++ char float int string 之间的转换

    string str = "123"; string 转 int int i = atoi( str.c_str() ); string 转 float float f = ato ...

  6. JAVA中UDP使用

    UDP协议 在有些应用程序中,保持最快的速度比保证每一位数据都正确到达更重要.例如,在实时音频或视频中,丢失数据包只会作为干扰出现.干扰是可以容忍的,但当TCP请求重传或等待数据包到达而它却迟迟不到时 ...

  7. 浅谈HTTP请求与响应

    HTTP协议用于客户端和服务器之间的通信,请求访问的一段是客户端,提供资源响应的一段是服务器端. HTTP通信是采用请求应答的方式来进行的,客户端发出请求,服务器响应.如果没有客户端的请求,服务器端是 ...

  8. [2011-3-9 12:59 ]As3.0中的位图(Bitmap/BitmapData)用法

    1.位图使用(模糊)滤镜 //创建一个矩形区域的BitmapData var bmd:BitmapData = new BitmapData(80, 30, false, 0xefefef); //画 ...

  9. MVc分页【关于使用扩展方法实现MVc分页】

    近期对MVc自定义分页作了一下小研究下面把他记下来 下述代1,2,3里面的代码可以直接拷贝,4以后的根据情况自己选定 1.在后台任写如下的扩展方法(任一类库都可以,但是用时得引用命名空间) // 添加 ...

  10. Junit中的setup和teardown方法

    setup需要@before注解,实现测试前的初始化工作 teardown需要@after注解,测试完成后垃圾回收等后续工作