一、定义

在不破坏封装性的前提下,捕获并外部化(externalize)一个对象的内部状态,这样就可以在以后将该对象恢复到这个状态。

二、类图表示

备忘录模式

三、实现

1、Memento

package pattern.behavioral.memento;

public class Memento {

	private String state;
	
	public Memento(String state) {
		this.state = state;
	}
	
	public String getState() {
		return state;
	}
}

2、Originator

package pattern.behavioral.memento;

public class Originator {

	private String state;

	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}
	
	public Memento createMemento(){
		return new Memento(state);
	}
	
	public void setMemento(Memento memento){
		this.setState(memento.getState());
		System.out.println(String.format("Restored state(%s) from memento", this.state));
	}
}

3、Caretaker

package pattern.behavioral.memento;

public class Caretaker {

	private Memento memento;

	public Memento getMemento() {
		return memento;
	}

	public void setMemento(Memento memento) {
		this.memento = memento;
	}
}

四、使用

package pattern.behavioral.memento;

public class Client {

	public static void main(String[] args) {
		Originator originator = new Originator();
		originator.setState("On");
		
		Caretaker caretaker = new Caretaker();
		caretaker.setMemento(originator.createMemento());
		
		originator.setState("Off");
		originator.setMemento(caretaker.getMemento());
	}
}
  • 程序输出:

Restored state(On) from memento

五、适用场合

  • 需要在某一时刻恢复一个对象之前的某个状态时

  • 需要在外部保存一个对象的某一时刻的状态而不破坏对象的封装性时(如果用一个接口让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性)