备忘录模式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. R语言之多重共线性的判别以及解决方法

    多重共线性(Multicollinearity)是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确.   1.可以计算X矩阵的秩qr(X)$rank,如果 ...

  2. android 弹出带按钮的对话框

    package com.example.helloworld; import android.os.Bundle;import android.app.Activity;import android. ...

  3. WKWebkit使用

    webkit使用WKWebView来代替IOS的UIWebView和OSX的WebView,并且使用Nitro JavaScript引擎,这意味着所有第三方浏览器运行JavaScript将会跟safa ...

  4. List泛型集合转DataTable

    自存,此方法可以防止出现DataSet不支持System.Nullable的错误 public static DataTable ToDataTable<T>(IEnumerable< ...

  5. JS正则表达式从入门到入土(2)—— 元字符和字符类

    元字符和字符类 元字符 正则表达式由两种基本字符类型组成: 1.原义(正常)文本字符:代表本身含义的字符,如:a.b.c.1.2.3等. 2.元字符:元字符是在正则表达式中有特殊含义的非字母字符,如\ ...

  6. Webpack -- 基础篇

    篇仅演示 webpack 的基础搭建,为入门和走通基本流程而写.仅 window 系统. 1. 安装一些东西 安装 nodeJS,下载链接.然后检查安装是否完成. 系统“开始”和“R”键同时按住,桌面 ...

  7. CentOS 6.3编译安装LAMP环境笔记

    转载地址:http://www.jb51.net/article/54969.htm 最近抽空在虚拟机上测试成功了LAMP各个最新版本的整合编译安装,算是把之前的博文整合精简,以下内容均在CENTOS ...

  8. GRUB2 分析 (一)

    GRUB是目前较流行启动引导程序.其第二版被主流Linux发行版所包括.本文将探索和分析GRUB的设计和实现机制. boot.S是第一个研究对象,因为boot.S将被编译成boot.img(512字节 ...

  9. 深度学习:Keras入门(二)之卷积神经网络(CNN)【转】

    本文转载自:https://www.cnblogs.com/lc1217/p/7324935.html 说明:这篇文章需要有一些相关的基础知识,否则看起来可能比较吃力. 1.卷积与神经元 1.1 什么 ...

  10. Mac Book Air 上用 Vmware Fusion 8 pro 安装 CentOS7

    一. 准备工作: 1. 安装Vmware Fusion (略) 2. 下载CentOS-7-x86_64-Minimal http://isoredirect.centos.org/centos/7/ ...