设计模式--备忘录模式C++实现

备忘录模式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;

  }

};

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

时间: 2024-11-12 19:43:58

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

【C#设计模式-备忘录模式】

一.备忘录模式的定义: 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 二.备忘录模式的结构和角色: 1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态.Originator可以根据需要决定Memento存储自己的哪些内部状态. 2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问

我的设计模式:备忘录模式

我的设计模式-备忘录模式 恢复到最初的状态-->对原始状态的保留和恢复 联想到的业务:cms稿件放入到回收站,永久记录状态得用到数据库啊,怎么办?备忘录模式的内存缓存不适用? 类的单一职责 boy职责:状态   改变状态  设置状态  获取状态 备忘录职责:记录当前的状态   恢复状态 迪 米特原则:最少知道原则,不和陌生人说话 问题:备忘录只是记录了一个节点,多个备忘录记录了多个节点,可以恢复到任意节点?备忘录因该支持多个节点? 思考问题:增加备忘录管理者manager角色,有啥好处呢?没体验

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

转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 角色 笔记本:很多的内部状态需要被建立一个备忘录来管理,创建和取出

设计模式--备忘录模式(Memento)

什么是备忘录模式? 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以将以后的对象状态恢复到先前保存的状态. 我们在编程的时候,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态.比如,我们使用Eclipse进行编程时,假如编写失误(例如不小心误删除了几行代码),我们希望返回删除前的状态,便可以使用Ctrl+Z来进行返回.这时我们便可以使用备忘录模式来实现. 代码示例: 代码演示了一个单状态单备份的例子,逻辑非常简单:Originator类中的sta

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

一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态.备忘录模式常常与命令模式和迭代子模式一同使用. 备忘录模式可以根据客户指令,将相应的对象特有属性进行快照,如果客户要恢复对象,则根据快照提供的特有属性进行还原. 二.模式代码 package memento.patten; /** *备忘录类,同时指定要保存的对象属性

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

声明:本系列博客參考资料<大话设计模式>,作者程杰. 备忘录模式又叫做快照模式或Token模式,在不破坏封闭的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. UML类图: 角色: 1.发起人(GameRole):负责创建一个备忘录,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态.发起人能够依据须要决定备忘录存储自己的哪些内部状态. 2.备忘录(RoleStateSaveBox):负责存储发起人对象的内部状态,并能够防止发起人以

设计模式-备忘录模式实现悔棋操作

利用设计模式中的备忘录模式实现多步悔棋的操作 1 import java.util.*; 2 class Chessman { 3 private String label; 4 private int x; 5 private int y; 6 public static int index=-1; 7 public Chessman(String label,int x,int y) { 8 this.label = label; 9 this.x = x; 10 this.y = y; 1

[设计模式] 备忘录模式Memento Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对备忘录模式是这样说的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 类图和实例: 简单的模式实例: #include <iostream> #include <string> using namespace std; class Memento { private:     string state; public:     Memento(

大话设计模式—备忘录模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式.所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态.很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃. 大话设计模式中程杰老师给出的定义是,备忘录模式:在不破坏封装性的前提下,捕获一个对象的内

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

模式动机 为了使软件的使用更加人性化,对于误操作,我们需要提供一种类似“后悔药”的机制,让软件系统可以回到误操作前的状态,因此需要保存用户每一次操作时系统的状态,一旦出现误操作,可以把存储的历史状态取出即可回到之前的状态.现在大多数软件都有撤销(Undo)的功能,快捷键一般都是Ctrl+Z,目的就是为了解决这个后悔的问题. 在应用软件的开发过程中,很多时候我们都需要记录一个对象的内部状态.在具体实现过程中,为了允许用户取消不确定的操作或从错误中恢复过来,需要实现备份点和撤销机制,而要实现这些机制