对象状态的变化无端,如何回溯/恢复对象在某个点的状态
如果我们想恢复对象的状态,那么我们可能首先想到的是把对象保存下来,但是这样会破坏对象的封装性。因为对象有状态有操作,如果我们为了保存对象而留着原来的对象,做一个深拷贝,那么其他对象也能通过这个对象的接口访问这个对象状态,这并不是我们所希望的。而我们需要它的职责只是保存和恢复对象状态,而不应在上面支持对对象状态访问的接口,这就产生了Memento模式。
动机(Motivation)
在软件构建过程中,某些对象的状态在转换的过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。
如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。
意图(Intent)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态(如果没有这个关键点,其实深拷贝就可以解决问题)。这样以后就可以将该对象恢复到原先保存的状态。
类图:
package Memento;
/**
* User: liuwentao@wentao365.com
* Date: 2008-12-9 Time: 16:11:54
* <p/>
* note: 备忘录(快照)角色
*/
class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return this.state;
}
public void setState(String state) {
this.state = state;
}
}
/**
* User: liuwentao@wentao365.com
* Date: 2008-12-9 Time: 16:12:27
* <p/>
* note: 负责人角色
*/
class Caretaker {
private Memento memento;
/**
* 返回快照
* @return
*/
public Memento retrieveMemento() {
return this.memento;
}
/**
* 保存快照
* @param memento
*/
public void saveMemento(Memento memento) {
this.memento = memento;
}
}
/**
* User: liuwentao@wentao365.com
* Date: 2008-12-9 Time: 16:11:41
* <p/>
* note: 发起人角色
*/
class Originator {
private String state;
/**
* 创建一个快照
* @return
*/
public Memento createMemento() {
return new Memento(state);
}
/**
* 从快照中还原
* @param memento
*/
public void restoreMemento(Memento memento) {
this.state = memento.getState();
}
public String getState() {
return this.state;
}
public void setState(String state) {
this.state = state;
System.out.println("Current state = " + this.state);
}
}
/**
* User: liuwentao@wentao365.com
* Date: 2008-12-9 Time: 16:12:36
* <p/>
* note: 客户端角色
*/
public class MementoTest1 {
private static Originator originator = new Originator();
private static Caretaker caretaker = new Caretaker();
public static void main(String[] args) {
//发起人角色设置状态
originator.setState("On");
//负责人角色 保存快照
caretaker.saveMemento(originator.createMemento());
//发起人角色改变状态
originator.setState("Off");
//恢复发起人先前状态
originator.restoreMemento(caretaker.retrieveMemento() );
}
}
转载: http://hi.baidu.com/fendou4533/blog/item/877b3f834207ce0ac75cc361.html