备忘录模式
备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern),属于行为型模式。备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
设计模式中的备忘录模式可以类比现实中的备忘录。现实生活中的备忘录是用来记录某些要去做的事情,或者是记录已经达成的共同意 见的事情,以防忘记了。而在软件层面,备忘录模式有着相同的含义,备忘录对象主要用来记录一个对象的某 种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作
备忘录模式的三个角色
- Originator(原发器):需要保存状态的对象。
- Memento(备忘录):备忘录对象,负责保存好记录,即
Originator
内部状态。 - Caretaker(负责人):负责人对象,负责保存多个备忘录对象,使用集合管理,提高效率。如果需要保存多个
Originator
对象的不同状态,可以使用 HashMap<String, 集合>来管理。
代码示例
Originator:原发器
package cn.personalweb.memento;
public class Originator {
// 状态信息
private String state;
/**
* 获取状态
* @return 返回状态信息
*/
public String getState() {
return state;
}
/**
* 设置状态
* @param state 状态信息
*/
public void setState(String state) {
this.state = state;
}
/**
* 将状态信息保存到Memento备忘录
* @return Memento 对象
*/
public Memento saveStateToMemento() {
return new Memento(state);
}
/**
* 通过备忘录从备忘录获取状态信息
* @param memento 备忘录
*/
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
Memento:备忘录
package cn.personalweb.memento;
public class Memento {
// 状态信息
private String state;
public Memento(String state) {
this.state = state;
}
/**
* 获取状态信息
* @return 状态信息
*/
public String getState() {
return state;
}
}
CareTaker:负责人
package cn.personalweb.memento;
import java.util.ArrayList;
import java.util.List;
public class CareTaker {
/**
* 备忘录列表
*/
private List<Memento> mementoList = new ArrayList<Memento>();
/**
* 添加备忘录到备忘录列表
* @param memento 备忘录
*/
public void add(Memento memento) {
mementoList.add(memento);
}
/**
* 从备忘录列表获取备忘录
* @param index 备忘录的索引
* @return 备忘录
*/
public Memento get(int index) {
return mementoList.get(index);
}
}
Client:客户端
package cn.personalweb.memento;
public class Client {
public static void main(String[] args) {
// 创建 Originator原发起
Originator originator = new Originator();
// 创建 CareTaker负责人
CareTaker careTaker = new CareTaker();
// 设置状态
originator.setState("State 11111111111");
originator.setState("State 22222222222");
// 先把状态保存到备忘录,然后将备忘录添加到负责人中.
Memento memento = originator.saveStateToMemento();
careTaker.add(memento);
// 设置状态
originator.setState("State 33333333333");
// 把状态保存到备忘录,再将备忘录添加到负责人中.
careTaker.add(originator.saveStateToMemento());
originator.setState("State 44444444444");
System.out.println("当前状态:" + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("第一次添加到备忘录的状态:" + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("第二次添加到备忘录的状态" + originator.getState());
}
}
输出
当前状态:State 44444444444
第一次添加到备忘录的状态:State 22222222222
第二次添加到备忘录的状态State 33333333333
备忘录模式的注意事项和细节
-
给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
-
实现了信息的封装,使得用户不需要关心状态的保存细节
-
如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存, 这个需要注意
-
适用的应用场景:1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数 据库的事务管理
-
为了节约内存,备忘录模式可以和原型模式配合使用
参考资料:
尚硅谷 Java 设计模式课程笔记。