* 在不破坏封装性的前提下,捕获一个对象的内部状态,并在改对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。
* Memento: 主要用来存储原发器对象的内部状态,但是具体需要存储哪些数据是由原发器对象来决定的。
* 另外备忘录应该 只能由 "原发器对象" 来访问它内部的数据, "原发器外部"的的对象 不应该访问到备忘录对象的内部数据
* Originator 原发器。 使用备忘录来保存某个时刻原发器自身的状态,也可以使用备忘录来回复内部状态
* Memento: 主要用来存储原发器对象的内部状态,但是具体需要存储哪些数据是由原发器对象来决定的。
* 另外备忘录应该 只能由 "原发器对象" 来访问它内部的数据, "原发器外部"的的对象 不应该访问到备忘录对象的内部数据
* Originator 原发器。 使用备忘录来保存某个时刻原发器自身的状态,也可以使用备忘录来回复内部状态
* Caretaker : 备忘录管理者,主要保存备忘录对象,但是不能对备忘录对象的内容进行操作或检查
public interface FlowAmockMemento {
}
public class FlowAmock {
private String flowName;
private int tempResult;
private String tempState;
public FlowAmock(String flowname){
this.flowName = flowname;
}
public void runPhaseOne(){
//在这个阶段 ,可能产生了中间的结果
tempResult = 3;
tempState = "phaseOne";
}
/**
* 示意,按照方案一来运行流程的后半部分
*/
public void schemal(){
this.tempState +=",Schemal";
System.out.println(this.tempState + " ; now run " + tempResult);
this.tempResult += 11;
}
/**
* 示意,按照方案一来运行流程的后半部分
*/
public void schema2(){
this.tempState +=",Schema2";
System.out.println(this.tempState + " ; now run " + tempResult);
this.tempResult += 22;
}
public FlowAmockMemento createMemento(){
return new MementoImpl(this.tempResult,this.tempState);
}
public void setMemento(FlowAmockMemento memento){
MementoImpl impl = (MementoImpl) memento;
this.tempResult = impl.tempResult;
this.tempState = impl.tempState;
}
private static class MementoImpl implements FlowAmockMemento{
private int tempResult;
private String tempState;
public int getTempResult() {
return tempResult;
}
public String getTempState() {
return tempState;
}
public MementoImpl (int tempResult,String tempState){
this.tempResult = tempResult;
this.tempState = tempState;
}
}
}
public class FlowAMementoCareTaker {
private FlowAmockMemento memento = null;
public void saveMemento(FlowAmockMemento memento){
this.memento = memento;
}
public FlowAmockMemento retriveMemento(){
return this.memento;
}
}
public class Client {
public static void main(String[] args) {
FlowAmock mock = new FlowAmock("TestFlow");
mock.runPhaseOne();
FlowAMementoCareTaker careTaker = new FlowAMementoCareTaker();
FlowAmockMemento memento = mock.createMemento();
careTaker.saveMemento(memento);
mock.schemal();
mock.setMemento(memento);
mock.schema2();
}
}