、C#のデザインパターン:メモモード(Mementoパターン)
1.主催者の役割(オリジネーター)は:現在の瞬間の内部状態を記録、メモデータを作成し、復元する責任があります。メメントの覚書を作成するための責任は、現在の時刻は、自分の内部状態を記録するため、および内部メモの状態を復元するために使用することができます。発信メメント[スポンサー] [メモ]は、自分の状態の内部に格納する必要があるものに応じて決めることができます。
2、覚書の役割(メメント):内部状態記憶スポンサーの責任は、回復のニーズ中の状態スポンサーを提供するために、オブジェクト、およびメモオリジネーター以外の他のオブジェクトへのアクセスを防ぐことができます。覚書には、2つのインタフェースを有している:世話人は、[管理ロールが狭いインターフェイスの覚書を見ることができる、彼は唯一の他のオブジェクトにメモを渡すことができます。発信プロモーターは[]が、それは所望の状態に復帰する前に、すべてのデータへのアクセスを可能にするメモ広いインターフェイスを見ることができます。
3、管理者の役割(管理人):メモオブジェクトを保存するための責任を負います。責任メモメメント、メメントコンテンツがアクセスまたは操作することができません。
第二に、コード
使用して、システムを 使用して; System.Collections.Genericを 使用して、System.Linqのを 使用して、System.Textのを 使用して、System.Threadingを、 使用System.Threading.Tasks; 名前空間_22メモモード。 { /// <要約> /// セクター-データをバックアップする、ステータスデータが動作していない /// </要約> パブリック 密閉 クラス部門の { /// <まとめ> /// セクター /// </要約> パブリック 文字列 DEPTNAME { GET、SET ;} / // <まとめ> /// 数 /// </要約> パブリック 文字列番号{ GET、SET ;} } /// <まとめ> /// プロモーターは- [役割同等の発信元をスポンサー /// / <概要> 公共 封印された クラスDeptBackOriginator { // プロモーターは、内部状態保存する必要が プライベートリスト<学科の> ; _deptList 公共一覧<学科の> DeptList { GET { 戻る この._deptListを; } SETを { この ._deptList = 値; } } /// <要約> /// セクターの初期化は、バックアップが必要です /// </要約> /// <PARAM NAME = "deptList"> </ param>の 公共一覧<学部の(DeptBackOriginatorを> deptList) { IF(deptList =!ヌル) { この ._deptList = deptList; } 他 { スロー 新しい新しい例外ArgumentNullExceptionザ・(" パラメータは空にすることはできません!" ); } } /// <概要> /// オブジェクトメモの連絡先リスト保存するために、現在の期間を保存するために、メモオブジェクトのインスタンスを作成します /// </要約> /// <戻り値> </戻り値が> 公共DeptMemento CreateMementoは、() { 返す 新しい新しい DeptMementoを(新しい新しいリスト<学部の>(この._deptList)); } /// <要約> /// データを復元するには、部門メモ一覧にバックアップ /// </要約> /// <PARAM NAME =「メメント「> </ PARAM> 公共 ボイドRestoreMemento(DeptMementoメメント) { この .DeptList = memento.DeptListBack。 } /// <まとめ> /// バックアップに含まれる表示データ /// </要約> 公共 ボイド表示() { Console.WriteLineを(" セクタリスト、{0}セクタの合計が、それらは:" 、DeptList.Count); foreachの(部門のP でDeptList) { Console.WriteLineを(" セクタ:番号{0}:{} 1。" 、p.DeptName、p.Number); } } } /// <まとめ> /// 用メモオブジェクト【備忘録の役割Memetoの等価-状態データを保存し、オブジェクトは、データの特定のステータスの保存た /// </要約> 公共 封印します クラスDeptMemento { /// <要約> /// 保存プロモーターセクタデータ作成 /// </要約> 公共一覧<学科の> DeptListBack { GET ; プライベート SET ;} 公共 DeptMemento(一覧<部門の> deptList) { DeptListBack = deptList; } } /// <まとめ> /// 管理の役割は、それがオブジェクト] [メモを管理することができる場合格納されたオブジェクト] [メモ、当然のことながら、追加、削除することができ、複数のストレージ管理処理対象のような- - [マネージャの役割暫定等価 /// </要約> パブリック 密閉 クラスMementoCaretaker { /// <概要> /// あなたがメモを保存したい場合は、[複数]オブジェクト、または辞書スタック格納する /// </要約> 公共辞書< 文字列、DeptMemento> DeptMementoDictionary { GET、SET ;} /// <まとめ> / // 単一バックアップ点 /// </要約> 公共 DeptMemento DeptMemento { GET、SET ;} パブリックMementoCaretaker() { DeptMementoDictionary = 新たな新しい辞書< 文字列、DeptMemento> (); } } クラスプログラム { 静的 ボイドメイン(文字列[]引数) { リスト <部署> DEPT = 新しいリスト<部門> () { 新しい部門(){DEPTNAME = " 技术部"、番号= " 15987487456 " }、 新しい部門() {DEPTNAME = " 人事部"、番号= " 15987487457 " }、 新しい部門(){DEPTNAME = " 产品部"、番号= "15987487458 " } }; #region単一のバックアップポイント// スポンサーの電話番号リスト DeptBackOriginator mobileOriginator = 新新DeptBackOriginator(DEPT); mobileOriginator.Show(); // メモメモオブジェクトの作成と保存 MementoCaretakerマネージャー= 新しい新しいMementoCaretakerを(); manager.DeptMemento = mobileOriginator.CreateMemento(); /// 最初のバックアップポイント作成 manager.DeptMementoDictionary.Add(" ワン" 、mobileOriginator.CreateMemento()); // 変更のスポンサーの連絡先リスト Console.WriteLineをを( " ---- --------最後の接触を除去" ); mobileOriginator.DeptList.RemoveAt(2 ); mobileOriginator.Show(); ///は、第2のバックアップポイント作成 のThread.sleepを(1000年); // 待つ10秒 manager.DeptMementoDictionary.Add(" 二" 、mobileOriginator.CreateMemento()); // 元の状態に復元し ます。Console.WriteLine(" -------復元コンタクトリスト--- --- " ); mobileOriginator.RestoreMemento(manager.DeptMemento); mobileOriginator.Show(); #endregion #region複数のバックアップポイント Console.WriteLineを(" ------ ------出力2つのバックアップ・ポイント" ); /// /出力バックアップポイント のforeach(VARの項目でmanager.DeptMementoDictionary) { mobileOriginator.RestoreMemento(item.Value ); mobileOriginator.Show(); } Console.WriteLineを(" -------最初のポイントへのバックアップを復元------ " ); mobileOriginator.RestoreMemento(manager.DeptMementoDictionary [ " ワン" ]) ; mobileOriginator.Show(); Console.WriteLineを("------ ------第二の点へのバックアップを復元" ); mobileOriginator.RestoreMemento(manager.DeptMementoDictionary [ " 二」]); mobileOriginator.Show(); #endregion Console.Read() ; } } }