备忘录模式

1.意图: 

    在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。 

2.类图: 

      

3.原理: 

4.特征: 

    备忘录(Memento)角色: 

    备忘录(Memento)角色的职责: 

    1.将发起人(Originator)对象的内部状态存储起来。 

    2.保护其内容不被发起人(Originator)对象之外的任何对象所读取。提供了两个等效的接口: 
     窄接口:负责人(Caretaker)对象(和其他除发起人对象之外的任何对象)看到的是备忘录的窄接口(narrow interface),这个窄接口只允许它把备忘录对象传给其他的对象。 
     宽接口:发起人(Originator)对象可以看到一个宽接口(wide interface),这个宽接口允许它读取所有的数据,以便根据这些数据恢复发起人对象的内部状态。 

    发起人(Originator)角色: 

    发起人(Originator)的职责: 
      1.创建一个含有当前的内部状态的备忘录对象。 

    2使用备忘录对象存储其内部状态。  

    负责人(Caretaker)角色: 

    负责人(Caretaker)角色的职责: 

    1.负责保存备忘录对象。 

    2.不查看或修改备忘录对象的内容。        


5.说明: 

    备忘录经常和迭代模式和命令模式一起使用。 

    本例是“白箱”实现,对于“黑箱”实现及“java实现双重接口”参见《java与模式》。 

6.使用案例: 

7.代码: 

// Originator.java 

public class Originator 



    private String state; 

   

    /** 

     * 工厂方法,返回一个新的备忘录对象 

     * @return 

     */ 

     public Memento createMemento() 

     { 

         return new ConcreteMemento(state); 

     } 

     /** 

      * 将发起人恢复到备忘录对象所记载的状态 

      * @param memento 

      */ 

     public void setMemento(Memento memento) 

     { 

         this.state = memento.getState(); 

     } 





// Memento.java 

/** 

* 备忘录将发起人对象的状态保存起来。 

*/ 

public class Memento 



     private String state; 

    

     Memento(String state) 

     { 

         this.state = state; 

     } 



     public String getState() 

     { 

         return state; 

     } 



     public void setState(String state) 

     { 

         this.state = state; 

     }  





// Caretaker.java 

/** 

* 负责人负责保存备忘录对象,但不修改(甚至查看)备忘录对象的内容 

* @author xmlin 



*/ 

public class Caretaker 



     private Memento memento; 

    

     /** 

      * 备忘录的取值方法 

      * @return 

      */ 

     public Memento retrieveMemento() 

     { 

         return this.memento; 

     } 

    

     /** 

      * 备忘录的赋值方法 

      * @return 

      */ 

     public void saveMemento(Memento memento) 

     { 

         this.memento = 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.retrieveMemento()); 


}

你可能感兴趣的:(备忘录模式)