首页 > 代码库 > 备忘录模式

备忘录模式

备忘录模式的定义

备忘录模式(Memento Pattern)提供了一种弥补真实世界缺陷的方法,让“后悔药”在程

序的世界中真实可行,其定义如下:

Without violating encapsulation,capture and externalize an object‘s internal state so that the

object can be restored to this state later.(在不破坏封装性的前提下,捕获一个对象的内部状

态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。)

通俗地说,备忘录模式就是一个对象的备份模式,提供了一种程序数据的备份方法

 

● Originator发起人角色

 

记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录

 

数据。

 

● Memento备忘录角色

 

负责存储Originator发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。

 

● Caretaker备忘录管理员角色

 

对备忘录进行管理、保存和提供备忘录。

 

发起人角色

 

public class Originator {

 

     //内部状态

 

     private String state = "";

 

     

 

     public String getState() {

 

             return state;

 

     }

 

     public void setState(String state) {

 

             this.state = state;

 

     }

 

     //创建一个备忘录

 

     public Memento createMemento(){

 

             return new Memento(this.state);

 

     }

 

     //恢复一个备忘录

 

     public void restoreMemento(Memento _memento){

 

             this.setState(_memento.getState());

 

     }

 

}

备忘录角色

public class Memento {

     //发起人的内部状态

     private String state = "";

     //构造函数传递参数

     public Memento(String _state){

             this.state = _state;

     }

     public String getState() {

             return state;

     }

     public void setState(String state) {

             this.state = state;

     }

}

备忘录管理员角色

public class Caretaker {

     //备忘录对象

     private Memento memento;

     public Memento getMemento() {

             return memento;

     }

     public void setMemento(Memento memento) {

             this.memento = memento;

     }

}

场景类

public class Client {

     public static void main(String[] args) {

             //定义出发起人

             Originator originator = new Originator();

             //定义出备忘录管理员

             Caretaker caretaker = new Caretaker();

             //创建一个备忘录

             caretaker.setMemento(originator.createMemento());

             //恢复一个备忘录

             originator.restoreMemento(caretaker.getMemento());

     }

}

备忘录模式的使用场景

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

● 提供一个可回滚(rollback)的操作;比如Word中的CTRL+Z组合键,IE浏览器中的后

退按钮,文件管理器上的backspace键等。

● 需要监控的副本场景中。

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

 

备忘录模式的注意事项

● 备忘录的生命期

备忘录创建出来就要在“最近”的代码中使用,要主动管理它的生命周期,建立就要使

用,不使用就要立刻删除其引用,等待垃圾回收器对它的回收处理。

● 备忘录的性能

不要在频繁建立备份的场景中使用备忘录模式(比如一个for循环中),原因有二:一是

控制不了备忘录建立的对象数量;二是大对象的建立是要消耗资源的,系统的性能需要考

虑。

 

备忘录模式