目录
0、定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
1、备忘录模式的三种角色
- 原发者(Originator):需要在某个时刻保存其状态的对象。原发者负责创建备忘录,当原发者需要恢复某个时刻的状态时,它通过获得相应备忘录中的数据来恢复那个时刻的状态。
- 备忘录(Memento):负责储蓄原发者状态的对象。
- 负责人(Caretaker):负责管理保存备忘录的对象。
2、备忘录模式的UML类图
3、示例代码
备忘录
package xyz.jangle.design.memento;
import java.io.Serializable;
public class Memento implements Serializable{
/**
*
*/
private static final long serialVersionUID = -4150939913438715041L;
int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
原发者
package xyz.jangle.design.memento;
public class Originator {
int state;
Memento createMemento() {
Memento memento = new Memento();
memento.setState(state);
return memento;
}
void restoreFromMemento(Memento memento) {
state = memento.getState();
}
void useState(){
state++;
}
}
负责人
package xyz.jangle.design.memento;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Caretaker {
File file;
private Memento memento = null;
public Caretaker() {
super();
this.file = new File("saveObject.txt");
}
public Memento getMemento() {
if(!file.exists())return null;
try {
ObjectInputStream inObject = new ObjectInputStream(new FileInputStream("saveObject.txt"));
memento = (Memento) inObject.readObject();
inObject.close();
} catch (Exception e) {
e.printStackTrace();
}
return memento;
}
public void saveMemento(Memento memento) {
try {
ObjectOutputStream outObject = new ObjectOutputStream(new FileOutputStream("saveObject.txt"));
outObject.writeObject(memento);
outObject.flush();
outObject.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端(使用)
package xyz.jangle.design.memento;
public class AppMain25 {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.useState();
System.out.println(originator.state); //此处是1
caretaker.saveMemento(originator.createMemento());
originator.useState();
System.out.println(originator.state); //此处是2
originator.restoreFromMemento(caretaker.getMemento());
System.out.println(originator.state); //此处还原至1
}
}
输出结果
1
2
1