memento备忘录模式,就是利用平常所说的备忘录的思想,把一些可能在以后要用到的东西先记起来,等到要用的时候就可以查询备忘录,再次利用。在软件设计中就是将对象的状态存储起来,根据需要,这个对象只要向备忘录发出一个请求就能够从备忘录读取数据并恢复到先前的状态。
既然是备忘录就会有一个或以上的信息来源,一条或以上的记录和一个记录集(记录管理)。需要存储信息的对象就是信息的来源。
因为隐私的原因,备忘录只有,记录人才能看到。同样的,备忘录对象必须对源发者之外的对象隐藏该原发者的内部变量的值。所以,在java中,记录类一般设计为内容类。
对于数据的储存方式,在"j道"写道:"设计模式之Memento:很简单一个模式,就是在内存中保留原来数据的拷贝. ",应不然,对于存储的方式应该根据不同的需要可以选择不同的形式,持久或者非持久。
一般架构:
//源发者,信息来源
public class Originator{
private String state;
public Memento createMemento(){//创建记录
return new Memento( this.state );
}
public void restoreMemento(Memento memento){//恢复记录
this.setState(memento.getState());
}
public String getState(){//获取记录
return this.state;
}
public void setState(String state){//设置记录
this.state = state;
}
//记录
class Memento {
private String savedState;
private Memento(String someState){
savedState = someState;
}
private void setState(String someState){
savedState = someState;
}
private String getState(){
return savedState;
}
}
}
//简单记录集(记录管理)
public class Caretaker{
private Memento memento;
public Memento retrieveMemento(){//获取记录
return this.memento;
}
public void saveMemento(Memento memento){//保存记录
this.memento = memento;
}
}
//多记录集(记录管理)
public class Caretaker{
private Originator originator;
private Vector mementos = new Vector();
private int total;
public Caretaker(Originator originator){
this.originator = originator;
total= 0;
}
public void createMemento(){ //创建
Memento memento = this.originator.createMemento();
mementos.addElement(memento);
total++;
}
public void saveMemento(Memento memento){//保存记录
mementos.addElement(memento);
total++;
}
public void retrieveMemento(int index){ //获取
Memento memento = (Memento) mementos.elementAt (index);
originator.restoreMemento(memento);
}
public void removeMemento(int index){//删除
mementos.removeElementAt(index);
total--;
}
}
在web程序中的session是mememto备忘录模式应用的一个典型例子。由servlet的session的函数setAttribute
(String,Object)和函数getAttribute(String),可以看出session的内部实现应该是利用一个哈希表储存对象状态的。