备忘录模式用于各种需要备份的操作,比如编辑器的ctrl+z的功能,或者游戏数据的存档等场景;本文以编辑器为例子来简单说明下备忘录设计模式设计的几个部分;考虑到一个场景,现在使用编辑器写文章,我们需要保存文章的各种历史操作,以便可以及时的回滚回去;
1.组成
先看下备忘录模式的几个组成部分,引用别人的图
1>Originator
叫做原发器,可以理解为操作的对象,比如上面的文章对象,有标题和内容,需要把他的内容备份起来;在这个对象里面有两个主要的方法restoreMemento 恢复上一次状态,createMemento根据当前的状态创建备忘录,他可以自己决定要备份哪些内容;
2>Memento
备忘录对象,提供设置和获取状态的方法,这里的属性要根据上面Originator备份的内容决定要存哪些信息;
3>Caretaker
负责人对象,负责持有备忘录的内容,保存管理备忘录对象;
2.例子
这里模拟文章编辑器的工作,文章包括标题和内容;针对每一次操作,我们要记录文章内容,以便在需要的时候进行恢复操作;
1>首先是文章对象
public class Doc {
private String title;
private String body;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public History createHistory() {
return new History(this.body);
}
public void restoreDoc(History history) {
this.body = history.getBody();
}
}
2>备忘录对象
这里就存储文章的内容部分
public class History {
private String body;
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public History(String body) {
this.body = body;
}
}
3>编辑器
编辑器负责管理备忘录对象,这里持有一个doc的引用,对文章可以进行恢复,清空内容,备份的操作;
public class Editor {
private Doc doc;
private List<History> histories = new ArrayList<>();
public Doc getDoc() {
return doc;
}
public void setDoc(Doc doc) {
this.doc = doc;
}
public List<History> getHistories() {
return histories;
}
public void setHistories(List<History> histories) {
this.histories = histories;
}
public void append(String content) {
doc.setBody(doc.getBody() + content);
histories.add(doc.createHistory());
}
public void restore() {
histories.remove(histories.size() - 1);
doc.restoreDoc(histories.get(histories.size() - 1));
}
public void delete() {
doc.setBody("");
histories.add(doc.createHistory());
}
}
测试代码
public static void main(String[] args) {
Doc doc = new Doc();
doc.setTitle("文章名称");
doc.setBody("第一页内容");
Editor editor = new Editor();
editor.setDoc(doc);
editor.append("aaaaa");
editor.append("bbbbb");
editor.append("cccc");
editor.append("ddddd");
editor.delete();
editor.restore();
editor.restore();
System.out.println(doc.getBody());
}
备忘录模式优点是:给用户提供了一种可以恢复状态的机制。可以是用户能够比较方便地回到某个历史的状态;封装了内部的细节,用户可以不用关心什么时候保存这些细节的内容;缺点是备忘录模式会占用较多的内存,消耗资源;