备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原来保存的状态。
备忘录模式结构图Memento(备忘录):负责存储Originator对象的内部状态,防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。
使用场景:
- Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类。
- 如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。
- 角色状态改变时,如果先状态无效,那么可以使用备忘录模式将这个状态恢复。
package com.memento;
public class Original {
//这个类的一些状态需要保存
private String value;
public Original(String value) {
this.value = value;
}
public Memento createMemento(){
return new Memento(value);
}
public void restoreMemento(Memento m){
this.value = m.getValue();
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
package com.memento;
public class Memento {
//一个备忘录对象
private String value;
public Memento(String value){
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
package com.memento;
public class Storage {
//存储备忘录对象
private Memento memento;
public Storage(Memento memento) {
super();
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
package com.memento;
/**
* ClassName: Main
* @Description:备忘录模式(Memento):
* 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,
* Original类是原始类,里面有需要保存的属性value及创建一个备忘录类,用来保存value值。
* Memento类是备忘录类,Storage类是存储备忘录的类,持有Memento类的实例,该模式很好理解。
* @author Panyk
* @date 2015年10月15日
*/
public class Main {
public static void main(String[] args) {
//创建原始类
Original o = new Original("egg");
//创建备忘录
Storage s = new Storage(o.createMemento());
//修改原始类值
System.out.println("原始值="+o.getValue());
o.setValue("new value");
System.out.println("更新值="+o.getValue());
//恢复原始值
o.restoreMemento(s.getMemento());
System.out.println("恢复值=" + o.getValue());
}
}
网友评论