初识设计模式 - 备忘录模式
简介
备忘录设计模式(Memento Design Pattern)也叫作快照(Snapshot)模式,主要用于实现防丢失、撤销、恢复等功能。
其定义是,在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象先前的状态。
典型实现
首先,定义一个备忘录 Memento
类存储状态,其代码示例如下:
public class Memento { | |
private String state; | |
public Memento(Originator o) { | |
this.state = o.getState(); | |
} | |
public void setState(String State) { | |
this.state = state; | |
} | |
public String getState() { | |
return this.state; | |
} | |
} |
然后,把需要被存储状态的对象称作为发起者,定义为 Originator
类,包含用于存储成员数据的属性,其代码示例如下:
public class Originator { | |
private String state; | |
public Originator() {} | |
// 创建一个备忘录对象 | |
public Memento createMemento() { | |
return new Memento(this); | |
} | |
// 根据备忘录状态恢复原发器状态 | |
public void restoreMemento(Memento m) { | |
state = m.getState(); | |
} | |
public void setState(String State) { | |
this.state = state; | |
} | |
public String getState() { | |
return this.state; | |
} | |
} |
定义一个负责人 Caretaker
用于管理备忘录对象,其代码示例如下:
public class Caretaker { | |
private Memento memento; | |
public Memento getMemento() { | |
return this.memento; | |
} | |
public void setMemento(Memento memento) { | |
this.memento = memento; | |
} | |
} |
总结
优点
备忘录模式的主要优点如下:
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
- 实现了内部状态的封装,使得用户不需要关心状态的保存细节
缺点
备忘录模式的主要缺点如下:
- 如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源
适用场景
备忘录模式的适用场景如下:
- 保存一个对象在某一时刻的全部状态或部分状态,方便后续实现恢复和撤销
- 防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象
源码
在 JDK 中 java.util.Date
通过自身内部的一个 Long 值来实现备忘录模式。
如下是源码部分:
public class Date implements java.io.Serializable, Cloneable, Comparable<Date> { | |
private transient long fastTime; | |
public Date(long date) { | |
fastTime = date; | |
} | |
public long getTime() { | |
return getTimeImpl(); | |
} | |
private final long getTimeImpl() { | |
if (cdate != null && !cdate.isNormalized()) { | |
normalize(); | |
} | |
return fastTime; | |
} | |
} |