Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_1Number_3Number_9Number_3Number_0Number_8Number_9
インデント OCPとデザインパターン
インデント サンプルコードについて
インデント デザインパターン ひとくちメモ
インデント FactoryMethodパターン
インデント AbstractFactoryパターン
インデント Builderパターン
インデント Prototypeパターン
インデント Adapterパターン
インデント Bridgeパターン
インデント Compositeパターン
インデント Decoratorパターン
インデント Facadeパターン
インデント Flyweightパターン
インデント Proxyパターン
インデント TemplateMethodパターン
インデント Chain of Responsibilityパターン
インデント Commandパターン
インデント Iteratorパターン
インデント Mediatorパターン
インデント Mementoパターン
インデント Observerパターン
インデント Stateパターン
インデント Strategyパターン
インデント Visitorパターン
インデント 速習!デザインパターン第一回
インデント 速習!デザインパターン第二回
インデント 速習!デザインパターン第三回
インデント UMLとは
インデント UML入門
インデント オブジェクト指向
インデント クラス図
インデント アクティビティ図
インデント インタラクション図
インデント ユースケース図
インデント Rarestyle証明書サービス
インデント QRコード発行WSDL
インデント QRコード発行サンプル
インデント J2EE覚書
インデント FreeMind実践レポート
インデント モバイル情報
インデント Homeページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

Mementoパターン (デザインパターン)

Mementoパターン 導入

Mementoパターンは、変更前のオブジェクトの状態を記憶しておくことにより、手続き後に前の状態に復元できるようにするパターンです

復元対象となるオブジェクト(Original)、記憶状態を表すオブジェクトをMemento、とします。 Originalクラスには記憶を保存するためのcreateMemento()メソッドと復元するrestoreMemento()メソッドを持ちます。

Mementoパターン ポイント

復元対象となるオブジェクトが記憶状態を保存するメソッド、復元するメソッドを実装します。 Mementoオブジェクトは、あくまで復元対象(Ordinal)の内部情報のコピーを示します。

UML Mementoパターン

C#ソースコード Mementoパターン

Sample.cs

using System;
using System.Collections;
namespace Memento
{

   //--------------------------------------------------------------
   //  デザインパターン Memento
   //
   //  変更前のオブジェクトの状態を記憶しておくことにより、手続き後に
   //  前の状態を復元できるようにすること。
   //
   //  追加
   //  1)オブジェクトの状態をある時点でそっくりそのままに戻す
   //  2)復元対象のオブジェクト自身が、記憶と復元処理を持つ
   //
   //--------------------------------------------------------------

   //元に戻したい状態を定義
   public class State :ICloneable
   {
       private int     intYokin;
       private string  strKanojo;
       private string  strStatus;

       //お金
       public int Yokin
       {
           set{this.intYokin=value;}
           get{return this.intYokin;}
       }
       //彼女
       public string Kanojo
       {
           set{this.strKanojo=value;}
           get{return this.strKanojo;}
       }
       //地位(ポジション)
       public string Status
       {
           set{this.strStatus=value;}
           get{return this.strStatus;}
       }
       public object Clone()
       {
           return MemberwiseClone();
       }
   }


   /// <summary>
   /// Originalクラス定義
   /// </summary>
   ///<remarks>
   ///実装するのは記憶するメソッドと復元できるメソッドです
   ///(実際の人生もこうなったらいいね)
   ///</remarks>
   public class Original
   {
       private State state;

       public Original(int intYokin,string strKanojo,string strStarus)
       {
           this.state=new State();
           this.state.Yokin =intYokin;
           this.state.Kanojo=strKanojo;
           this.state.Status=strStarus;
       }

       //状態変更アクセスメソッド
       public State OriginState
       {
           get{return this.state;}
       }

       //状態確認メソッド
       public void getStateInfo()
       {
           Console.WriteLine("現在の預金額  :{0}",this.state.Yokin);
           Console.WriteLine("現在の彼女    :{0}",this.state.Kanojo);
           Console.WriteLine("現在の地位    :{0}",this.state.Status);
       }

       //記憶するメソッド
       public Memento CreateMemento()
       {
           //内部のState情報は状態変更アクセスメソッドで参照されるため
           //変わらないようにクローンを作り,このコピーから
           //Mementoのインスタンスを生成します
           //(やっぱり、これが注意と書いてありますね)
           return new Memento((State)state.Clone());
       }

       //復元するメソッド
       public void ResotreMemento(Memento memento)
       {
           //Mementoからの情報を自分自身の内部情報に置き換えます
           this.state =memento.GetState;
       }
   }

   //記憶クラス
   //自分の状態を記憶する
   public class Memento
   {
       private State state;

       public Memento(State state)
       {
           this.state=state;
       }

       public State GetState
       {
           get{return this.state;}
       }
   }

   //管理人クラス
   //
   public class Caretaker
   {
       //Memetoクラスを保持しますが
       //Memetoの内部情報には関与しません
       //つまり管理人さんは記憶を預かるだけなのね。
       private ArrayList Mementos =new ArrayList();

       public Memento getMemento(int index)
       {
           return (Memento)Mementos[index];
       }

       public void AddMemento(Memento Mem)
       {
           this.Mementos.Add(Mem);
       }
   }

   /// <summary>
   /// Class1 の概要の説明です。
   /// </summary>
   class Class1
   {
       /// <summary>
       /// アプリケーションのメイン エントリ ポイントです。
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {
           //ある男Taroのケース()
           //お金も、女も、仕事もいまいちなTaro君
           //これからスタート
           //0番目の状態
           Original Taro =new Original(10000,"地味子","フリーター");

           //ここで記憶を管理人さんに預けます
           Caretaker cr=new Caretaker();
           cr.AddMemento(Taro.CreateMemento());

           //1番目の状態
           //預金が5万円になった
           Taro.OriginState.Yokin=50000;           //ちょっと,羽振りが
           //彼女が華子になった
           Taro.OriginState.Kanojo="派手ちゃん";    //気張ってゴージャスに
           //フリータが店長になった
           Taro.OriginState.Status="コンビニ店長";   //同窓会出れそー

           //今現在の情報
           cr.AddMemento(Taro.CreateMemento());
           Taro.getStateInfo();

           //さらに変化
           //2番目の状態
           Taro.OriginState.Yokin=-20000;          //ああ、、借金が!!
           Taro.OriginState.Kanojo="お嬢ちゃん";    //最後はやはり?
           Taro.OriginState.Status="青年実業家";    //肩書きはバブルなみ

           //今現在の情報
           cr.AddMemento(Taro.CreateMemento());
           Taro.getStateInfo();

           //やっぱり昔がいいなあ
           //管理人さん記憶を...昔に復元してぇ~
           Taro.ResotreMemento(cr.getMemento(0));  //0番目の記憶に戻る

           Taro.getStateInfo();
           //あれ、やっぱり戻らなかったほうがよかったかも??
       }
   }
}

Memento 実行結果

Memento_fig

UMLプラグインによる描画 Mementoパターン

Javaソースコード Mementoパターン

State.java
   1: package menento;
   2: 
   3: public class State implements Cloneable {
   4: 
   5:     private int Yokin;
   6: 
   7:     private String Kanojo;
   8: 
   9:     private String Status;
  10: 
  11:     public int getYokin() {
  12:         return Yokin;
  13:     }
  14: 
  15:     public void setYokin(int Yokin) {
  16:         this.Yokin = Yokin;
  17:     }
  18: 
  19:     public String getKanojo() {
  20:         return Kanojo;
  21:     }
  22: 
  23:     public void setKanojo(String Kanojo) {
  24:         this.Kanojo = Kanojo;
  25:     }
  26: 
  27:     public String getStatus() {
  28:         return Status;
  29:     }
  30: 
  31:     public void setStatus(String Status) {
  32:         this.Status = Status;
  33:     }
  34: 
  35:     public Object clone() throws CloneNotSupportedException {
  36:         return super.clone();
  37:     }
  38: 
  39: }
Origin.java
   1: package menento;
   2: 
   3: public class Origin {
   4: 
   5:     private State state;
   6: 
   7:     public State getState() {
   8:         return state;
   9:     }
  10: 
  11:     public void setState(State state) {
  12:         this.state = state;
  13:     }
  14: 
  15:     public void getStateInfo() {
  16:         System.out.println("現在の預金額は" +this.state.getYokin()+"円です");
  17:         System.out.println("現在の彼女は" +this.state.getKanojo()+"です");
  18:         System.out.println("現在の地位は" +this.state.getStatus()+"やってます。");
  19:     }
  20:     
  21:     //状態をMementoオブジェクトとして返す。
  22:     public Memento createMemento() throws CloneNotSupportedException {
  23:         //状態のコピーを作り、Mementoインスタンスにセットして
  24:         //Mementoオブジェトを返します。
  25:         Memento forgetMemento =new Memento();
  26:         forgetMemento.setMementoState((State)this.state.clone());
  27:     
  28:         return forgetMemento;
  29:     }
  30:     
  31:     //Mementoオブジェクトから状態を復元する
  32:     public void restoreMemento(Memento memento) {
  33:         //Mementoオブジェクトから状態を再セットします。
  34:         this.state=memento.getMementoState();
  35:     }
  36: 
  37:     //コンストラクタで一発セット
  38:     public Origin(int Yokin, String Kanojo, String Status) {
  39:         this.state =new State();
  40:         this.state.setYokin(Yokin);
  41:         this.state.setKanojo(Kanojo);
  42:         this.state.setStatus(Status);
  43:     }
  44: 
  45: }
Memento.java
   1: package menento;
   2: 
   3: public class Memento   {
   4: 
   5:     private State MementoState;
   6: 
   7:     public State getMementoState() {
   8:         return MementoState;
   9:     }
  10: 
  11:     public void setMementoState(State MementoState) {
  12:         this.MementoState = MementoState;
  13:     }
  14: 
  15: }
Caretaker.java
   1: package menento;
   2: 
   3: import java.util.ArrayList;
   4: 
   5: public class Caretaker {
   6: 
   7:     private ArrayList mementos =new ArrayList();
   8: 
   9:     public Memento getMemento(int index) {
  10:         return (Memento)mementos.get(index);
  11:     }
  12: 
  13:     public void addMemento(Memento memento) {
  14:         this.mementos.add(memento);
  15:     }
  16: 
  17: }
StartClass.java
   1: package menento;
   2: 
   3: public class StartClass {
   4: 
   5:     public static void main(String[] args) throws CloneNotSupportedException {
   6:         
   7:         //0番目の状態
   8:         Origin taro =new Origin(10000,"地味チャン","フリータ");
   9:         //記憶を管理する管理人インスタンスの作成
  10:         Caretaker caretaker =new Caretaker();
  11:         
  12:         //状態を報告
  13:         caretaker.addMemento(taro.createMemento());
  14:         taro.getStateInfo();
  15:         
  16:         //1番目の状態
  17:         taro.getState().setYokin(50000);
  18:         taro.getState().setKanojo("派手ちゃん");
  19:         taro.getState().setStatus("コンビニ店長");
  20:         //状態を報告
  21:         caretaker.addMemento(taro.createMemento());
  22:         taro.getStateInfo();
  23:         
  24:         //2番目の状態
  25:         taro.getState().setYokin(-200000);
  26:         taro.getState().setKanojo("お嬢ちゃん");
  27:         taro.getState().setStatus("青年実業家");
  28:         //状態を報告
  29:         caretaker.addMemento(taro.createMemento());
  30:         taro.getStateInfo();
  31:         
  32:         //0番目に記憶を復元 
  33:         taro.restoreMemento(caretaker.getMemento(0));
  34:         taro.getStateInfo();
  35:     }
  36: }



コミュニティマーカーデザインパターン「ひとくちメモ」へ

コミュニティマーカーHomeへもどる

お天気情報
東京都 東京 - 今日の天気
曇り - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2012/02/05 17:00:00  ST: True
東京都 東京 - 明日の天気
晴のち雨 - リンク先
最高 最低
気温 9 3
湿度 48.2 37.4
取得日:2012/02/05 17:00:00  ST: True
東京都 東京 - あさっての天気
晴時々曇 - リンク先
最高 最低
気温 11 4
湿度 51.8 39.2
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - 今日の天気
晴のち曇 - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - 明日の天気
- リンク先
最高 最低
気温 11 5
湿度 51.8 41
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - あさっての天気
曇時々晴 - リンク先
最高 最低
気温 7 3
湿度 44.6 37.4
取得日:2012/02/05 17:00:00  ST: True
livedoorのWebサービスより提供
【工事中】お天気配信 ユーザー登録
rarestyle
Copyright 2006 Rarestyle このページへのリンクは確認不要です。
Programming by Xenon Project Team     postmaster@rarestyle.net
免責事項について
レアスタイルサイト内検索