不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后可将该对象恢复到原先保存的状态
适用场合:功能较复杂,但需要维护或记录属性历史,或需要保存的属性只是众多属性的一小部分
Originator.java
package com.gary.designpattern.memento;
/**
* 发起人
* @author gary
*
*/
public class Originator {
//需要保存的属性
private String messageA;
private String messageB;
public String getMessageA() {
return messageA;
}
public void setMessageA(String messageA) {
this.messageA = messageA;
}
public String getMessageB() {
return messageB;
}
public void setMessageB(String messageB) {
this.messageB = messageB;
}
//创建备忘录
public Memento createMemento(){
Memento memento = new Memento();
//将信息保存到Memento对象
memento.setMessageA(messageA);
memento.setMessageB(messageB);
return memento;
}
//恢复备忘录
public void restoreMemento(Memento memento){
//恢复信息
messageA = memento.getMessageA();
messageB = memento.getMessageB();
}
@Override
public String toString() {
return "Originator [messageA=" + messageA + ", messageB=" + messageB + "]";
}
}
Memento.java
package com.gary.designpattern.memento;
/**
* 备忘录
* @author gary
*
*/
public class Memento {
//需要保存的属性
private String messageA;
private String messageB;
public String getMessageA() {
return messageA;
}
public void setMessageA(String messageA) {
this.messageA = messageA;
}
public String getMessageB() {
return messageB;
}
public void setMessageB(String messageB) {
this.messageB = messageB;
}
}
Caretaker.java
package com.gary.designpattern.memento;
/**
* 管理者
* @author gary
*
*/
public class Caretaker {
//备忘录
private Memento memento;
public void setMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
Test.java
package com.gary.designpattern.memento;
/**
* 测试
* @author gary
*
*/
public class Test {
public static void main(String[] args) {
Originator originator = new Originator();
//初始状态
originator.setMessageA("hello");
originator.setMessageB("world");
System.out.println("初始状态: ");
System.out.println(originator);
Caretaker caretaker = new Caretaker();
//保存状态,隐藏Originator实现细节
caretaker.setMemento(originator.createMemento());
originator.setMessageA("messageA has changed");
originator.setMessageB("messageB has changed");
System.out.println("改变后: ");
System.out.println(originator);
//恢复
originator.restoreMemento(caretaker.getMemento());
System.out.println("恢复后: ");
System.out.println(originator);
}
}