您的位置:首页 > 其它

设计模式-备忘录模式

2016-12-29 07:56 197 查看

一、定义

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


二、应用

2.1 使用场景

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

提供一个可回滚(rollback)的操作;比如Word中的CTRL+Z组合键,IE浏览器中的后 退按钮,文件管理器上的backspace键等。

需要监控的副本场景中。例如要监控一个对象的属性,但是监控又不应该作为系统的 主业务来调用,它只是边缘应用,即使出现监控不准、错误报警也影响不大,因此一般的做 法是备份一个主线程中的对象,然后由分析程序来分析。

数据库连接的事务管理就是用的备忘录模式,想想看,如果你要实现一个JDBC驱

动,你怎么来实现事务?还不是用备忘录模式嘛!

2.2 注意事项

备忘录的生命期

备忘录创建出来就要在“最近”的代码中使用,要主动管理它的生命周期,建立就要使 用,不使用就要立刻删除其引用,等待垃圾回收器对它的回收处理。

备忘录的性能

不要在频繁建立备份的场景中使用备忘录模式(比如一个for循环中),原因有二:一是 控制不了备忘录建立的对象数量;二是大对象的建立是要消耗资源的,系统的性能需要考 虑。因此,如果出现这样的代码,设计师就应该好好想想怎么修改架构了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式