モチベーション(意欲を高めます)
ソフトウェア構築プロセスでは、変換プロセス中の一部の物体の状態は、需要は、被験体へのポイントの前の状態に戻って置くことができるいくつかの用途のために必要とされてもよいです。あなたが他のオブジェクトは、オブジェクトの状態を取得できるようにするために、パブリックインターフェイスの一部を使用している場合は、オブジェクトは、実装の詳細を公開します。
どのように保存修復の良好な状態の目的を達成するために、しかし同時に、オブジェクト自体のカプセル化を破壊されないのだろうか?
テント(意図)
そしてカプセル化、キャプチャに違反することなく、オブジェクトの内部状態を外部化し、(キーポイント、実際には、深いコピーが問題を解決することができない場合)、オブジェクトの外の状態を保存します。だから後で、あなたは以前に保存された状態にオブジェクトを復元することができます。 - 「デザインパターン」のGoF
図構造(構造)
合成モード
:図から分かるように、図メモモードの構造において以下の役割があり
(1)、スポンサーの役割(発信者):現在の瞬間の内部状態を記録し、それがメモデータを作成し、復元する責任があります。メメントの覚書を作成するための責任は、現在の時刻は、自分の内部状態を記録するため、および内部メモの状態を復元するために使用することができます。発信メメント[スポンサー] [メモ]は、自分の状態の内部に格納する必要があるものに応じて決めることができます。
(2)、覚書の役割(メメント):復元ニーズを後援するために利用可能な状態の間に、スポンサーのオブジェクトの内部状態を保存するための責任、および発信以外のオブジェクトへのアクセスメモを防ぐことができます。覚書には、2つのインタフェースを有している:世話人は、[管理ロールが狭いインターフェイスの覚書を見ることができる、彼は唯一の他のオブジェクトにメモを渡すことができます。発信プロモーターは[]が、それは所望の状態に復帰する前に、すべてのデータへのアクセスを可能にするメモ広いインターフェイスを見ることができます。
(3)、管理者の役割(管理人):メモオブジェクトを保存するための責任を負います。責任メモメメント、メメントコンテンツがアクセスまたは操作することができません。
メモモードコードを実装
今日はメモモードの実現を説明するために、バックアップの電話帳の例を使用します。次のようにコードは次のとおりです。
静的 ボイドメイン(文字列[]引数) { リスト <ContactPerson>人= 新しいリスト<ContactPerson> () { 新 ContactPerson(){NAME = " 黄飞鸿"、MOBILENUMBER = " 13533332222 " }、 新しい ContactPerson(){NAME = " 方世玉"、MOBILENUMBER = " 13966554433 " }、 新しい ContactPerson(){NAME = " 洪熙官"、MOBILENUMBER = "13198765544" } }; // スポンサーの電話番号リスト MobileBackOriginator mobileOriginator = 新新MobileBackOriginator(人); mobileOriginator.Show(); // メモメモオブジェクトの作成と保存 MementoManagerマネージャー= 新新MementoManager(); manager.ContactPersonMemento = )(mobileOriginator.CreateMementoを; // スポンサーコンタクトリストの変更 (Console.WriteLineをする" ---- --------最後の連絡先を削除" ); mobileOriginator.ContactPersonList.RemoveAt(2 ); mobileOriginator.Show(); // 元の状態に復元し ます。Console.WriteLine(" ------- ------連絡先リストを復元" ); mobileOriginator.RestoreMemento(manager.ContactPersonMemento); mobileOriginator.Show(); } // 接触-データがバックアップされる、状態がありますデータなし動作 公共 密閉 クラスContactPerson { // 名前 パブリック 文字列名前{ GET、SETを}; // 電話番号 パブリック 文字列 MOBILENUMBER { GET、SET ;} } // プロモーターは- [同等の発信の役割をスポンサー 公衆 密封された クラスMobileBackOriginator { // プロモーターは、内部の状態保存する必要が プライベートリスト<ContactPerson> _personListを、 公共の一覧<ContactPerson> ContactPersonList { GET { 戻る この._personListを; } SET { この ._personList = 値; } } // 初期化バックアップ対象の電話リスト 公開します MobileBackOriginator(一覧<ContactPerson> personList) { IF(personList =!ヌル) { この ._personList = personList; } 他 { スロー 新しい新しい例外ArgumentNullExceptionが(「パラメータが空にすることはできません!」); } } // メモオブジェクトのインスタンスを作成し、現在のコンタクトリストが保存されますにメモオブジェクトに保存する 公共ContactPersonMemento CreateMemento() { 返す 新しい新 ContactPersonMemento(新しい新しいリスト<ContactPersonを>は、(この._personList)); } // メモデータのバックアップを、コンタクトリストに復元 公共 ボイドRestoreMemento(ContactPersonMementoメメント) { この .ContactPersonList = memento.ContactPersonListBack; } 公共 ボイド表示() { Console.WriteLineを(" コンタクトリストは{0}個人があり、それらは:" 、ContactPersonList.Count); foreachの(ContactPerson P- でContactPersonList) { Console.WriteLineを(" 名:番号{0}:{1} " 、p.Name、p.MobileNumber); } } } // - [メモ同等の役割Memetoメモオブジェクトは、状態データを格納するための、オブジェクトが特定の状態データに格納された パブリック 密閉 クラスContactPersonMementoは { // 開始セーブ人によって作成された電話帳データ、いわゆる状態 の公共リスト<ContactPerson> ContactPersonListBack { GET、プライベート SET ;} 公共 ContactPersonMemento(一覧<ContactPerson> personList) { ContactPersonListBack = personList; } } // 管理役割、それが管理することができるオブジェクト] [メモ、記憶された複数のオブジェクトは] [メモ、当然のことながら、追加、削除、およびオブジェクトの等が格納されていることができれば管理プロセス--- [管理者の役割暫定の同等 公共 封印された クラスMementoManager { // 複数のオブジェクト[メモ]を保存したい場合は、辞書やスタックを保存することができ、スタックオブジェクトは、オブジェクトを保持することができます順序を反映 // など:辞書公共の<string、ContactPersonMemento> {ContactPersonMementoDictionaryを取得または設定;} 公共 ContactPersonMemento ContactPersonMemento { GET、SET ;} }
ポイントメモモードを実現します:
髪を必要に応じて内部状態メモ(メメント)一次記憶装置(オリジネータ)オブジェクト、元の状態を復元します。メメントモードが適している「髪の元管理が、情報は主の外に格納されなければなりません。」
実装メメントモードでは、オブジェクトアクセスメモ一次装置以外のオブジェクトを防止します。メモのオブジェクトは、二つのインターフェース、プライマリインターフェイスの広い用途を有し、他のオブジェクトの狭いインターフェースです。Mementoパターンを実装するには、オブジェクトのオーバーヘッドが比較的大きい場合は、Mementoパターンを改善するために(つまり、唯一の状態変化を覚えている)、いくつかの増分変更を使用することができ、オブジェクトの状態のコピーの効率化を検討します。
また、シリアル化された方法の覚書を使用することができます。シリアライズした後、我々は地元の一時データベース、ファイル、プロセス、およびその他の外部のプロセスに保存することができます。
(1)、メモモードの主な利点は次のとおりです。
オペレータのエラーは、データの整合性を破損した場合1]、その後、元の正しいデータにデータを復元するために、メモモードを使用することができます。
2]、各バックアップの状態を管理するためのスポンサーのための必要はありませんので、スポンサーよりバックアップ役に保存された状態データ。しかし、それは、単一責任の原則に沿って、覚書の役割、およびターン覚書マネージャの役割管理における役割、によって管理されています。
3]、回復を述べます、ユーザーが簡単に新しい状態が無効であるか、問題がある特定の歴史的段階に戻ることができるように、以前に保存されたメモを使用することができ、状態の回復のための実装メカニズムを提供します。
4]カプセル化情報を達成するために、メモのオブジェクトは、プライマリオブジェクトの指標である、他のコードが変更されないであろう、このモデルはスタックを使用して、唯一のメモは、プライマリ状態に格納されている主な目的は、簡素化保存するメモオブジェクトは、複数のメモを格納するためのオブジェクトの集合を定義するための責任者を通じて、複数のアンドゥ操作を実装することができます。
5]、このモデルは、打ち上げの人間を簡素化します。もはや管理し、彼らが必要とするこれらの状態の独自のバージョンを管理できるクライアントのバージョンの内部状態を保存する必要がありませんスポンサー。
変更の状態スポンサーの役割は、この状態で無効があるかもしれないとき6]、我々は一時的に保存されたメモを使用することができ、この時間は、リカバリを述べます。
(2)主な欠点メモモードです。
1]、実用的なシステムでは、複数のバックアップ、追加のリソースを必要とするので、より深刻な資源の消費を維持する必要があるかもしれません。我々はいくつかのソフトウェアは、アンドゥ機能を提供する理由を理解するのは容易であることがわかっている場合、リソースの過剰消費は、あまりにもクラスのメンバ変数ならば、必然的に多くのメモリを取る、と時間を節約するオブジェクトのすべての状態は、メモリリソースを消費する必要があります実行時のメモリとハードディスクの空き容量で必要なことは比較的大きいです。
状態は完全にメモに格納されているオブジェクトの役割を後援するために必要がある場合2]、その後、メモオブジェクト上のリソースの消費量が非常に高価になるだろう。
3]、保存された覚書の頭の役割は、担当者が知らないかもしれないときに、この状態は、ユーザの操作は非常に高価である思い出させることができないくらいのストレージ・スペースを、取るだろう。
4]、ときの変化の状態スポンサーの役割は、契約が無効であることも可能です。状態は、成功率が高くない変更された場合、「もし」プロトコルモードを取ることをお勧めします。
(3)以下の場合にはメモモードを使用することも考えられます。
システムがロールバックの動作モードを提供する必要がある場合1]、メモを使用するのに適しています。例えば、テキストエディタはCtrl + Zは、操作の実装、データベーストランザクション操作を元に戻します。
それは以前の状態に必要な場合、後で復元できるように2]、オブジェクトの状態は、時間又は状態の特定の部分を保存します。
実装の詳細を公開し、オブジェクトのカプセル化オブジェクトを破るだろう、他のオブジェクトがこれらの状態を取得できるようにするインタフェース場合3]、オブジェクトが直接その内部状態にアクセスするために外の世界を望んでいない、それは、その内部状態責任者を通じて間接的にアクセスすることができます。
4]、時にはメモモードを使用して、その後、オブジェクトのいくつかの内部情報スポンサーが対象のスポンサー以外の場所に格納されなければならないが、オブジェクトは、プロモーターそれ自体によって読み取られなければならない他のオブジェクトに内部情報スポンサーを複雑にすることができます境界が適切にパッケージ内に保持することができるように、シールド。
カプセル化(4)メモ
1]、覚書のパッケージは、プライマリデバイスに加えて、他のクラスは、も覚書のクラスを訪問するべきでないことを確実にするためには、実際の開発では、覚書と主との関係は非常に特別で、彼らが共有したいです他のクラスをさせることなく、情報は方法が異なるプログラミング言語によるものと異なる達成することを知っています。
(5)マルチバックアップ達成
1]、オブジェクトの集合を定義するための責任者は、複数の状態を保存し、簡単に歴史的な状態に戻すことができます。
バックアップ・オブジェクトは、いくつかのトークンを行うことができたとき2]、チェックポイントと呼ばれるこれらのトークンは、(ポイントをチェックしてください)。HashMapのなどを使用して実装された場合のキーのチェックポイントを設定するために使用することができます。
類似点と相違点(6)メメントコマンドモードとモード
実際にメメントメモモードとコマンドモードコマンド、いくつかの微妙な違いがあります、私たちは今、彼らの類似点と相違点を見てみましょう。両方のサポート操作を元に戻すが、行動のコマンドをパッケージ化している間、メメントは目的に異なっているオブジェクトの状態のために予約されています。彼らはまた、元に戻す操作の異なるレベルをサポートし、コマンドアクションシーケンスの操作で、メメントは、状態の振る舞いに動作しています。記憶されたコマンド・モード・コマンドは、メモモード状態(データ構造に対応する状態、そのような性質として)格納されている特異的プロモーター(コマンドに対応する動作)、及びスポンサーです。詳細をつかみ、より良いサービスモードに私たちを可能とするアプリケーションシナリオのモードを理解しています。
.NETメモモードを実装
正味実現メモモードが発見されていないが、彼のスキルは十分ではないようです、現在の枠組みでは、労力を必要としています。個人的な理解、このモデルは、実際には、多くのソフトウェアがこの機能を持っているのWord、Excel、および他のツールと同様に、機能を元に戻すことができ、業務システムで多く使用されているようだ、ソフトウェアの実行時間、常に自分自身の状態ストレージでエラーが発生した場合、または関連する操作を実行することができたときに失効する必要があります。