备忘录模式介绍
见名知义,备忘录模式是用来保存对象的当前状态,并且在之后可以再次恢复到此状态,备忘录模式实现的方式需要保证对象的状态不能被对象从外部访问,目的是为了更好的保存这些对象的完整性以及实现内部不向外暴露。
备忘录模式的定义
在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
备忘录模式的使用场景
(1)需要保存一个对象在某一时刻的状态或部分备忘录模式的类图
备忘录模式的类图
角色介绍
- Originator - 需要用备忘录模式保存自身内部状态的对象,负责创建一个备忘录(Memoto),可以记录、恢复自身的内部状态
- Memoto - 备忘录角色,用于存储originator的内部状态,并且可以防止Originator以外的对象访问Memoto
- Caretaker - 负责存储备忘录,不能对备忘录的内容进行操作和访问,只能把备忘录传递给其他对象
备忘录模式的简单示例
对备忘录模式来说,比较形象的是记事本中的存档功能,点击存档后,就算每次我们在记事本上写下一段话后,不小心退出了,再次进来时,还会接着上次的文本继续来写,下面用代码来实现。
首先记事本软件,即Originator角色
public class NotePad {
private String mText = "";
//在记事本上写文本
public void note(String text){
mText += text;
System.out.println("写笔记:" + mText);
}
//退出记事本
public void quit(){
System.out.println("当前文本:" + mText);
System.out.println("退出记事本!");
}
//创建备忘录
public Memoto createMemoto(){
Memoto memoto = new Memoto();
memoto.text = mText;
return memoto;
}
//恢复存档
public void restore(Memoto memoto){
mText = memoto.text;
System.out.println("恢复后的记事本文本:" + mText);
}
}
在记事本中,我们中设置了一个字段,用来存储文本,当调用note方法时记笔记,在笔记本中通过createMemoto方法创建备忘录对象,将自身状态保存到一个Memoto对象中,外部可以通过restore方法将记事本的状态从备忘录对象恢复。
下面来看备忘录对象,存储文本字段,即Memoto角色
public class Memoto {
public String text;
@Override
public String toString() {
return "Memoto: 存储的文本text = " + text;
}
}
Memoto中只是用来保存Originator一些字段,防止外部直接访问Originator,而备忘录的直接操作者是Caretaker角色
负责管理Memoto,即Caretaker角色
public class Caretaker {
private Memoto mMemoto;//备忘录
//存档
public void storeMemoto(Memoto memoto){
mMemoto = memoto;
}
//获取存档
public Memoto restoreMemoto(){
return mMemoto;
}
}
Caretaker负责管理Memoto对象,我们再来看客户端代码
客户端
public class Client {
public static void main(String[] args){
//构建记事本
NotePad notePad = new NotePad();
//构建Caretaker
Caretaker caretaker = new Caretaker();
//记笔记
notePad.note("今天发现了");
//存档
caretaker.storeMemoto(notePad.createMemoto());
//退出记事本
notePad.quit();
//再次进入笔记本
NotePad notePad2 = new NotePad();
//恢复存档
notePad2.restore(caretaker.restoreMemoto());
//接着写
notePad2.note("很好玩的事情");
}
}
输出结果
写笔记:今天发现了
退出记事本!当前文本:今天发现了
恢复后的记事本文本:今天发现了
写笔记:今天发现了很好玩的事情
在客户端中先构建了一个记事本,然后写东西,通过Caretaker存档,退出,再次构建笔记本,通过Caretaker恢复数据,就接上了上次的文本。在这之中,并没有直接存储NotePad对象,而是通过Memoto对象对NotePad对象数据进行存储,把对Memoto的存取操作交给Caretaker对象。整个过程中,各个对象分工明确。
总结
备忘录模式是在不破坏对象封装的条件下,通过备忘录对象存储另外一个对象内部状态,在合适的时候把这个对象还原。
优点:
(1)给用户提供一种可以恢复状态的机制
(2)实现信息的封装,使得用户不需要关心状态的保存细节
缺点:
(1)消耗资源,如果类成员过多,每保存一次都会消耗一定的资源