意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
适用性
必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它才能恢复到先前的状态。
备忘录模式的构成
- 备忘录(Memento)角色:保持原发器(Originator)的内部状态,根据原发器来决定保存哪些内部的状态。备忘录可以有效地利用两个接口。看管者只能调用狭窄(功能有限)的接口——它只能传递备忘录给其他对象。而原发器可以调用一个宽阔(功能强大)的接口,通过这个接口可以访问所有需要的数据,使原发器可以返回先前的状态。
- 原发器(Originator)角色:创建一个备忘录,记录它的当前内部状态。可以利用一个备忘录来恢复它的内部状态
- 看管者(Caretaker)角色:只负责看管备忘录。不可以对备忘录的内容操作或者检查
package com.designpattern;
/**
* 备忘录模式
*/
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
// 准备好了中间数据
System.out.println("--------数据初始化值");
originator.setState(1);
originator.execute();
// 将中间数据存储在备忘录中
Memento memento = originator.createMemento();
// 将中间数据存储在备忘录管理器中
Caretaker caretaker = new Caretaker();
caretaker.setMemento(memento);
System.out.println("--------修改数据");
originator.setState(2);
originator.execute();
// 从备忘录管理器中获取备忘录
Memento reMemento = caretaker.getMemento();
originator.restoreMemento(reMemento);
System.out.println("--------备忘录还原数据");
originator.execute();
// 面临场景
// 你的系统会生产一份中间数据,这份中间数据要么是没法一直在内存里保留,要么可能会被修改
// 所以逼得你迫不得已,必须得通过备忘录的方式,将中间数据暂存一份儿
// 在一堆操作过后,可能之前内存中的中间数据都弄丢了,也可能赵昂见数据被人篡改了
// 接下来,你需要从备忘录中恢复我们的中间数据
// 基于恢复的中间数据,再次执行后面的操作
}
/**
* 备忘录
*/
public static class Memento {
private int state;
public Memento(int state) {
this.state = state;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
/**
* 原发器
*/
public static class Originator {
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
Memento createMemento(){
return new Memento(state);
}
public void restoreMemento(Memento memento){
this.state = memento.getState();
}
public void execute(){
System.out.println("执行方法 state :"+state);
}
}
/**
* 看管者
*/
public static class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
}