行为模式是对不同对象之间划分责任和算法的抽象化,行为模式不仅仅是关于类和对象的,而且是关于他们之间的相互作用和相互通信。行为模式分为行为对象模式和行为类模式。行为类模式采用继承机制在类间分派行为。行为对象模式使用对象复合而不是继承。
备忘录模式:是一种行为对象型模式。在不破坏封装性的前提条件下,捕获一个对象的内部状态,并在改对象之外保存该状态。以后就可以将该对象恢复到以前保存的状态。
有时有必要记录一个对象的内部状态,为了允许客户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制,而要实现这些机制,需要事先把对象的状态保存在某处,这样才能恢复以前的状态。但是对象通常封装了其状态,使得其状态不能被其他对象访问。在不破坏封装的前提条件下,保存对象的状态。备忘录模式是用来解决这个问题的。
备忘录参与者:备忘录类(Mementor),发起人类(Originator),负责人类(CareTaker)。
备忘录类(Mementor):将原发器的内部状态储存起来,原发器根据需要决定备忘录储存原发器的哪些内部状态。防止原发器以外的其他对象访问备忘录。备忘录有二个接口,一个是窄接口,一个是宽接口。CareTaker只能看到窄接口,他只能把备忘录传递给其他对象。相反Originator看到的是一个宽接口,允许它访问返回到先前状态所需的数据。
原发器类(Originator):创建一个备忘录对象,使用备忘录储存它的内部状态。
负责人类(CareTaker):负责保存好备忘录对象,不能检查或操作备忘录的内容。
在Java中,为了实现双接口,可以把Mementor类设置成Originator类的内部类。,从而将Mementor对象封装在Originator内,对外部提供一个标识接口MementoIF给CareTaker以及其他对象。这样Originator看到的是Mementor的所有接口,而CareTaker看到的仅是标识接口。
Mementor类和Originator类:
public class Originator{
private String state;
public Originator(){
//构造函数
}
public MementoIf createMemento(){
return new Memento(this.state);
}
public void setState(String state){
this.state=state;
System.out.println("state="+state);
}
//内部类
protected class Memento implements MementoIf{
private String saveState;
private Memento(String saveState){
this.saveState=saveState;
}
private void setSaveState(String saveState){
this.saveState=saveState;
}
private String getSaveState(){
}
}
接口MementoIf:
public Interface MementoIf{
}
CareTaker类:
public class CareTaker{
private MementoIf memento;
public MementoIf getMemento(){
return this.memento;
}
public void setMemento(MementoIf memento){
this.memento=memento;
}
}
备忘录在以下情况下使用:
(1)必须保存一个对象在某一个时刻的状态/部分状态,这样以后需要时它能够恢复到以前的状态。
(2)如果用一个接口来让其它对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
备忘录模式最大的缺点是资源消耗够大,如果类的成员变量太多,就不可避免的占用大量的内存。