备忘录( Memento)模式: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

适用性:

  • 必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它才能恢复到先前的状态。
  • 如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。


memento.bmp

所涉及的角色:

备忘录角色:将发起人 (Originator) 的对象内部状态存储起来,备忘录可以根据发起人对象的的判断来决定存储多少发起人( Originator )对象的内部状态。奋忘录同时可以保护其内容不被发起人 (Originator) 对象之外的任何对象所索。

 

发起人 (Originator) 角色:创建一个含有当前的内部状态的的备忘录对象 , 使用备忘录对象存储内部状态。

 

负责人( Caretaker )角色:负责保存备忘录对象,不检查备忘录对象的内容。


一个简单的例子:
备忘录角色

package  Memento;

public   class  Memento {
    
private  String state;
    
// 构造方法
     public  Memento(String state) {
        
this .state = state;
    }

    
// 状态的赋值方法
     public   void  setState(String state) {
        
this .state = state;
    }

    
// 状态的取值方法
     public  String getState() {
        
return   this .state;
    }

}
发起人 (Originator) 角色:
package Memento;

public class Originator{
    
private String state;
    
//工厂方法,返回一个新的备忘录对象
    public Memento createMemento(){
        
return new Memento(state);
    }

    
//将发起人的状态恢复到备忘录对象所保存的状态
    public void restoreMemento(Memento memento){
        
this.state=memento.getState();
    }

    
//状态的赋值方法
    public void setState(String state){
        
this.state=state;
        System.out.println(
"Current State:"+state);
    }

    
//状态取值方法
    public  String getState(){
        
return this.state;
    }

}
负责人( Caretaker )角色:
package Memento;

public class Caretaker{
    
private Memento memento;
    
//备忘录的取值方法
    public Memento retriveMemento(){
        
return this.memento;
    }

    
//备忘录的赋值方法
    public void saveMemento(Memento memento){
        
this.memento=memento;
    }


}

客户端:
package Memento;

public class Client{
    
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.retriveMemento());
        
//输出当前发起人对象的状态
        System.out.println(o.getState());
        
    }

}


参考资料:《java与模式》
《设计模式速查找手册》