备忘录:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.
Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态.
Originator可根据需要决定Memento存储Originator的哪些内部状态.
Memento(备忘录):负责存储Originator对象的内部对象,并可防止Originator以外的其他对象访问备忘录Memento.
备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能讲备忘录传递给其他对象.Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据
Caretaker(管理者):负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查
白箱实现:将发起人角色的状态存储在一个大家都看得到的地方,因此是破坏封装性的
public static void main(String[] args) {
int state = 3;
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.setState(state);
/**
* 创建备忘录对象的 缓存起来
*/
caretaker.saveMemento(originator.creatMementoObject());
/*
* 进行设置重新还原
*/
originator.setState(5);
System.out.println("发起人更改状态:" + originator.getState());
originator.restoreMemento(caretaker.retrieveMemento());
}
/**
* 管理者 负责管理Caretaker
* @author guk
*
*/
public class Caretaker {
private Memento memento;
/**
* 备忘录的取值方法
*/
public Memento retrieveMemento() {
return this.memento;
}
/**
* 备忘录的赋值方法
*/
public void saveMemento(Memento memento) {
this.memento = memento;
}
}
/**
* 发起者,负责备忘录的创建,修改,恢复
* @author guk
*
*/
public class Originator {
private int state = 0;
public Memento creatMementoObject() {
return new Memento(state);
}
/**
* 将发起人恢复到备忘录对象所记载的状态
*/
public void restoreMemento(Memento memento) {
this.state = memento.getState();
System.out.println("恢复 备忘录 状态:" + state);
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
/**
* 备忘录 对发起者进行缓存的类
* @author guk
*
*/
public class Memento {
private int state;
public Memento() {
super();
}
public Memento(int state) {
this.state = state;
System.out.println("备忘录 当前保存 状态:" + state);
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
黑箱备忘录 将Memento角色放在Originator角色类的内部,并使Memento类继承一个MementoIF接口,这样可以使得备忘录角色对发起者可见,对外部来说只能看到MementoIF接口, 不破坏封装性
public static void main(String[] args) {
int state = 3;
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.setState(state);
/**
* 创建备忘录对象的 缓存起来
*/
caretaker.saveMemento(originator.creatMementoObject());
/*
* 进行设置重新还原
*/
originator.setState(5);
System.out.println("发起人更改状态:" + originator.getState());
originator.restoreMemento(caretaker.retrieveMemento());
}
/**
* 发起者
* 内部类如何拿到外部类的引用
* 以及外部类如何访问内部类中的成员
* @author guk
*
*/
public class Originator {
private int state = 0;
public Memento creatMementoObject() {
return new Memento(state);
}
/**
* 将发起人恢复到备忘录对象所记载的状态
*/
public void restoreMemento(MementoIF momIf) {
this.setState(((Memento) momIf).getState());
System.out.println("黑箱恢复 备忘录 状态:" + state);
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
private class Memento implements MementoIF {
private int state;
public Memento(int state) {
this.state = state;
System.out.println("黑箱备忘录 当前保存 状态:" + state);
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
}
public class Caretaker {
private MementoIF memento;
/**
* 备忘录的取值方法
*/
public MementoIF retrieveMemento() {
return this.memento;
}
/**
* 备忘录的赋值方法
*/
public void saveMemento(MementoIF memento) {
this.memento = memento;
}
}
public interface MementoIF {
}