mementoメモモード


memento覚書モードとは、普段言われている覚書の考え方を利用して、後で使う可能性のあるものを先に覚えて、使うときに覚書を調べて、再利用することです.ソフトウェア設計では、オブジェクトの状態を格納し、必要に応じて、このオブジェクトは、メモに要求するだけで、メモからデータを読み出し、以前の状態に復元することができる.メモである以上、1つ以上の情報源、1つ以上の記録、1つの記録セット(記録管理)があります.情報を格納する必要があるオブジェクトが情報のソースです.プライバシーのせいで、メモは、記録者だけが見ることができます.同様に、メモオブジェクトは、ソース送信者以外のオブジェクトに対して、その送信者の内部変数の値を非表示にする必要があります.したがってjavaでは、レコードクラスは一般的にコンテンツクラスとして設計される.データの格納方法については、「設計モードのMemento:メモリに元のデータのコピーを残す簡単なモード」とj道に書いてある.そうでなければ、ストレージの方法は、必要に応じて異なる形式、永続的または非永続的を選択することができるはずです.
一般的なアーキテクチャ:
//   ,    
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プログラムにおけるセッションはmemtoメモモードアプリケーションの典型的な例である.servletのセッションによる関数setAttribute
(String,Object)と関数getAttribute(String)は,sessionの内部実装がハッシュテーブルを用いてオブジェクト状態を格納すべきであることがわかる.