需要跟进多重检查点。
1.用意
又叫快照模式或Token模式。
备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。
2.类图
白箱实现
黑箱实现
3.代码
白箱实现
/*
* 备忘录角色
*/
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState(){
return state;
}
public void setState(String state) {
this.state = state;
}
}
/*
* 负责人角色
*/
public class Caretaker {
private Memento memento;
public Memento retrieveMemento() {
return memento;
}
public void saveMemento(Memento memento) {
this.memento = memento;
}
}
/*
* 发起人角色
*/
public class Originator {
private String state;
public Memento createMemento() {
return new Memento(state);
}
/*
* 将发起人恢复到备忘录对象所记载的状态
*/
public void restoreMemento(Memento memento) {
this.state = memento.getState();
S.s("Current state = " + this.state);
}
public String getState() {
return this.state;
}
public void setState(String state) {
this.state = state;
S.s("Current state = " + this.state);
}
}
/*
* 测试类
*/
public class Test {
private static Originator o = new Originator();
private static Caretaker c = new Caretaker();
public static void main(String[] args) {
o.setState("On");
c.saveMemento(o.createMemento());
o.setState("Off");
o.restoreMemento(c.retrieveMemento());
}
}
黑箱实现
/*
* 标识接口
*/
public interface MementoIF {
}
/*
* 负责人角色
*/
public class Caretaker {
private MementoIF memento;
public MementoIF retrieveMemento() {
return this.memento;
}
public void saveMemento(MementoIF memento) {
this.memento = memento;
}
}
/*
* 发起人角色
*/
public class Originator {
private String state;
public Originator() {
}
public MementoIF createMemento() {
return new Memento(this.state);
}
/*
* 将发起人恢复到备忘录对象所记载的状态
*/
public void restoreMemento(MementoIF memento) {
Memento aMemento = (Memento)memento;
this.setState(aMemento.getState());
S.s("Current state = " + this.state);
}
public String getState() {
return this.state;
}
public void setState(String state) {
this.state = state;
S.s("Current state = " + this.state);
}
/*
* 备忘录角色
*/
protected class Memento implements MementoIF{
private String savedState;
public Memento(String someState) {
this.savedState = someState;
}
public String getState(){
return savedState;
}
public void setState(String someState) {
this.savedState = someState;
}
}
}
/*
* 测试类
*/
public class Test {
private static Originator o = new Originator();
private static Caretaker c = new Caretaker();
public static void main(String[] args) {
o.setState("On");
c.saveMemento(o.createMemento());
o.setState("Off");
o.restoreMemento(c.retrieveMemento());
}
}
z