我们平时写代码,会遇到中间有个变量要保存一下,等一会还要使用,我们可以使用一个变量把它暂时的保存起来,要使用的时候,再去使用; 当我们现在是一个对象的一个时刻的状态要暂时的保存起来,以便下次我再使用的时候呢,我们其实也是可以使用备忘录模式来把这个中间状态来保存,下次我再来使用这个状态,这其实本质也就是备份---名如其功能。
备忘录模式定义:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
适用性:
1.必须保存一个对象在某一时刻的状态,这样以后需要时它才能恢复到先前的状态
2.如果一个用户接口来让其它的对象直接得到这些状态,将会暴露对象的实现细节并且破坏对象的封装性
参与者:
1.Memento
备忘录存储原发器对象的内部状态
2.Originator
原发器创建一个备忘录,用以记录当前时刻的内部状态
3.Caretaker
负责保存好备忘录,不能对备忘录的内部进行操作或检查
一个简单的样例:
Memento
要保存的内容,也就是原发器对象的内部状态
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;
}
}
Originator
要保存内容的对象,对它进行相应的处理,主要是createMemento()和setMemento(Memento menemto)
public class Originator {
private String state;
public String getState(){
return state;
}
public void setState(String state){
this.state = state;
}
public Memento createMemento(){
return new Memento(state);
}
public void setMemento(Memento menemto){
state = memento.getState();
}
public void showState(){
System.out.println(state);
}
}
Caretaker
public class Caretaker{
private Memento memento;
public Memento getMemento(){
return this.memento;
}
public void setMemento(Memento memento){
this.memento = memento;
}
}
Test:
public class Test{
public static void main(String[] args){
Originator org = new Originator();
org.setState("开会中");
Caretaker ctk = new Caretaker();
ctk.setMemento(org.createMemento());//将数据封装在Caretaker
org.setState("睡觉中");
org.showState();
org.setMemento(ctk.getMemento());//将数据重新导入
org.showState();
}
result:
睡觉中
开会中