Mementoパターン
適切な時点でオブジェクトを復元するために、オブジェクトの状態を保存するためのメモモード(Mementoパターン)。 覚書パターンは、行動パターンに属します。
入門
意図:オブジェクトの内部状態を捕獲するのカプセル化に違反し、オブジェクトの外で状態を保存せずに。
主に解決するために:モデルは、オブジェクトの内部状態をキャプチャし、オブジェクトが後で以前に保存した状態に戻すことができるように、オブジェクトの外の状態を保存し、パッケージを破壊することなく、いわゆる覚書です。
使用するとき:何度も私たちは常にオブジェクトの内部状態を記録しておく必要があり、そうすることの目的は、ユーザーが不確定または不適切な操作をキャンセルできるようにすることです、彼は食べることを「後悔」しているように、彼の元の状態に復元することができます。
修正方法:オブジェクトの状態を保存するために設計されたクラス別のメモ。
キーコード:メモ管理クラスに結合されたメモクラスを持つ顧客がいない夫婦、。
応用例:1、後でそれを後悔。2、ゲームアーカイブを再生。 3、WindowsのレーンCTRI + zの。 4、バックでIE。 4、トランザクション管理データベース。
利点:1、ユーザーが状態の歴史に戻るには、より便利にすることができる機構の状態を復元する方法をユーザーに提供します。2、ユーザは詳細の保存状態を心配する必要がないように、情報のパッケージを実現します。
短所:リソースを消費します。あまりにもクラスのメンバ変数場合は、比較的大きなリソースを取るためにバインドされている、とあなたが保存するたびに一定量のメモリを消費します。
使用シナリオ:1、シーンデータの関連状態を保存/復元する必要があります。図2は、ロールバック操作が提供されます。
注:1、デメテルの原則を満たすために、また、クラス管理メモを追加します。図2は、メモリを節約するために、あなたはプロトタイプモデル+メモモードを使用することができます。
実現
メモモードは三つのクラスメメント、オリジネーターや世話人を使用しています。 状態に復元するオブジェクトを含む記念品。 発信メメントオブジェクトが作成された状態で格納されています。 世話人のオブジェクトは、メメント状態からオブジェクトを復元するための責任があります。
MementoPatternDemoは、世話人と発信オブジェクトを使用して私たちのデモクラスは、オブジェクトの回復の状態を表示します。
ステップ1
メメントクラスを作成します。
Memento.java
パブリッククラスメメント{ プライベート文字列の状態。 公共メメント(文字列の状態){ this.state =状態。 } パブリック文字列getStateを(){ 状態を返します。 } }
ステップ2
オリジネータークラスを作成します。
Originator.java
パブリッククラスオリジネーター{ プライベート文字列の状態。 公共ボイドSETSTATE(文字列の状態){ this.state =状態。 } パブリック文字列getStateを(){ 状態を返します。 } 公共メメントsaveStateToMemento(){ 新しいメメント(状態)を返します。 } 公共ボイドgetStateFromMemento(メメントメメント){ 状態= Memento.getState(); } }
ステップ3
世話人のクラスを作成します。
CareTaker.java
輸入はjava.util.ArrayList; 輸入java.util.Listに。 パブリッククラス世話人{ プライベートリスト<メメント> mementoList =新しいのArrayList <メメント>(); 公共ボイド追加(メメント状態){ mementoList.add(状態)。 } 公共メメント{(int型のインデックス)を取得 mementoList.get(インデックス)を返します。 } }
ステップ4
世話人と発信オブジェクトを使用してください。
MementoPatternDemo.java
パブリッククラスMementoPatternDemo { 公共の静的な無効メイン(文字列[] args){ 発信元=新しいオリジネータ(); 世話人の世話人=新しい世話人(); originator.setState(「状態#1 "); originator.setState(「状態#2 "); careTaker.add(originator.saveStateToMemento()); originator.setState(「状態#3 "); careTaker.add(originator.saveStateToMemento()); originator.setState(「状態#4 "); System.out.println( "現在の状態:" + originator.getState()); originator.getStateFromMemento(careTaker.get(0)); System.out.println( "最初の状態を保存した:" + originator.getState()); originator.getStateFromMemento(careTaker.get(1))。 System.out.println( "第二の状態を保存した:" + originator.getState()); } }
ステップ5
出力を確認します。
現在の状態:状態#4 最初の保存状態:状態#2 第二に保存された状態:状態#3