定义:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
图示:
Originator(发起者): 负责创建一个备忘录,并且可以记录、恢复自身的内部状态。可以根据需要决定Memento保存自身的那些内部状态
Memento(备忘录): 用于存储Originator的状态,防止Originator以外的的对象访问Memento
Caretaker( 备忘录管理者): 负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象
示例一:
public class Originator {
private String state;
/** 创建一个新的备忘录对象 */
public Memento createMemento(){
return new Memento(state);
}
/** 将发起者的状态恢复到备忘录的状态 */
public void restore(Memento memento){
this.state = memento.getState();
}
}
public class Caretaker {
private Memento mMemento;
public Memento restoreMemento(){
return mMemento;
}
public void storeMemengto(Memento memento){
this.mMemento = memento;
}
}
public class Memento {
private String state;
public Memento(String state){
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
示例二:
class Originator {
private State state;
public void setState(State state) {
System.out.println("Originator: Setting state to " + state.toString());
this.state = state;
}
public Memento save() {
System.out.println("Originator: Saving to Memento.");
return new Memento(state);
}
public void restore(Memento m) {
state = m.getState();
System.out.println("Originator: State after restoring from Memento: " + state);
}
}
class Memento {
private State state;
public Memento(State state) {
this.state = state;
}
public State getState() {
return state;
}
}
class Caretaker {
private List<Memento> mementos = new ArrayList<>();
public void addMemento(Memento m) {
mementos.add(m);
}
public Memento getMemento() {
return mementos.get(mementos.size()-1);
}
}
public class Demonstration {
public static void main(String[] args) {
Caretaker caretaker = new Caretaker();
Originator originator = new Originator();
originator.setState("State1");
originator.setState("State2");
caretaker.addMemento( originator.save() );
originator.setState("State3");
caretaker.addMemento( originator.save() );
originator.setState("State4");
originator.restore( caretaker.getMemento() );
}
}
总结:
备忘录模式是为了保存对象的内部状态,并在将来恢复,大多数软件提供的保存、打开,以及编辑过程中的Undo、Redo都是备忘录模式的应用。