备忘录模式(保存一个对象的某个状态,以便在适当的时候恢复对象)
-
优点
1、提供了一种可以恢复状态的机制。可以使用户能够比较方便地回到某个历史的状态。
2、实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
3、发起人不需要管理状态信息,所有状态信息都保存在备忘录中,并由管理者进行管理。 -
缺点
1、资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。 -
备忘录模式主要角色
发起人:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能。
备忘录:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
管理者:提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。 -
例子:模拟word文档编辑和撤销操作,类图如下:
-
代码实现
发起人:
public class Originator {
private String text;
public void setText(String text) {
this.text = text;
}
public String getText() {
return text;
}
/**
* 创建备忘录
*/
public Memento createMemento() {
return new Memento(text);
}
/**
* 撤销操作
*/
public void restoreMemento(Memento memento) {
if (memento == null) {
this.text = "";
} else {
this.text = memento.getText();
}
}
}
备忘录:
public class Memento {
private String text;
public Memento(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
管理者:
public class Caretaker {
private List<Memento> mementos = new ArrayList<>();
// 添加备忘录
public void add(Memento memento) {
mementos.add(memento);
}
// 获取上一个备忘录
public Memento getLastMemento() {
if (mementos.size() <= 1) {
return null;
} else {
mementos.remove(mementos.size() - 1);
return mementos.get(mementos.size() - 1);
}
}
}
测试:
public class Test {
public static void main(String[] args) {
Caretaker caretaker = new Caretaker();
Originator originator = new Originator();
originator.setText("我");
caretaker.add(originator.createMemento());
System.out.println("编辑操作:" + originator.getText());
originator.setText("我很");
caretaker.add(originator.createMemento());
System.out.println("编辑操作:" + originator.getText());
originator.setText("我很优");
caretaker.add(originator.createMemento());
System.out.println("编辑操作:" + originator.getText());
originator.setText("我很优秀");
caretaker.add(originator.createMemento());
System.out.println("编辑操作:" + originator.getText());
originator.restoreMemento(caretaker.getLastMemento());
System.out.println("撤销操作:" + originator.getText());
originator.restoreMemento(caretaker.getLastMemento());
System.out.println("撤销操作:" + originator.getText());
originator.restoreMemento(caretaker.getLastMemento());
System.out.println("撤销操作:" + originator.getText());
originator.restoreMemento(caretaker.getLastMemento());
System.out.println("撤销操作:" + originator.getText());
}
}
// 运行结果
编辑操作:我
编辑操作:我很
编辑操作:我很优
编辑操作:我很优秀
撤销操作:我很优
撤销操作:我很
撤销操作:我
撤销操作: