备忘录模式

备忘录模式的定义

备忘录模式(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循环中),原因有二:一是

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

虑。

原文地址:https://www.cnblogs.com/future-zmy/p/6298539.html