行为型模式——备忘录模式
2020-08-30 本文已影响0人
Doooook
概念
备忘录模式用于保存对象的内部状态而不破坏其封装,并在以后阶段恢复其状态。比如涉及到事务操作,需要回滚时就需要保存之前的状态。
实现
备忘录模式依赖于三个类——Originator、Memento和Caretaker
image.png
- Originator(发起者):发起者是我们需要记住状态的对象,以便在某个时刻恢复它。
- Caretaker(管理者):这是负责触发发起者的变化或触发发起者返回先前状态的动作的类。
- Memento(备忘录):这是负责存储发起者内部状态的类。备忘录提供了两种设置和获取状态的方法,但这些方法应该对管理者隐藏。
应用实例
发起者CarOriginator
CarOriginator包含一个内部类CarMemento(备忘录),用于保存状态(saveState
方法),恢复(restoreState
)时使用
/**
* @author: Jay Mitter
* @date: 2020-08-29 22:03
* @description: 发起者,通过创建一个新的备忘录对象来保存自己的内部状态
*/
@Data
public class CarOriginator {
private String state;
/**
* 创建一个新的备忘录对象,保存发起者的状态
* @return Memento
*/
public CarMemento saveState() {
return new CarMemento(this.state);
}
/**
* 恢复状态
* @param carMemento
*/
public void restoreState(CarMemento carMemento) {
this.state = carMemento.getState();
}
/**
* CarMemento class
*/
public static class CarMemento {
private final String state;
public CarMemento(String state) {
this.state = state;
}
private String getState() {
return state;
}
}
}
测试,备忘录管理者CarCaretaker
/**
* @author: Jay Mitter
* @date: 2020-08-29 22:05
* @description: 备忘录管理者,负责保存备忘录对象,但是从不修改(甚至不查看)备忘录对象的内容
*/
public class CarCaretaker {
public static void main(String[] args) {
new CarCaretaker().runMechanicTest();
}
private void runMechanicTest() {
CarOriginator.CarMemento carMemento = new CarOriginator.CarMemento("");
CarOriginator originator = new CarOriginator();
originator.setState("State1");
originator.setState("State2");
carMemento = originator.saveState();
originator.setState("State3");
originator.restoreState(carMemento);
System.out.println("final state: " + originator.getState());
}
}
结果:
final state: State2
总结
备忘录模式实在不破坏封装的条件下,通过备忘录对象(Memento)存储另外一个对象内部状态的快照,在将来合适的时候把这个对象还原到存储起来的状态。
优点
- 给用户提供了一种可以恢复状态的机制,可以是用户能够方便的回到某个历史的状态
- 实现了信息的封装,是的用户不需要关心状态的保存细节
缺点
- 消耗资源,如果累的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。