戦略モード
ポリシーモデルは、アルゴリズムのセットのために意図され、各アルゴリズムは、別のクラスにカプセル化され、彼らはお互いを置き換えることができるように、共通のインタフェースを持っています。ポリシーモードの変更は、アルゴリズムは、クライアントの状況に影響を与えることができないことができます。
戦略パターンの構造
戦略モードアルゴリズムのパッケージであり、およびアルゴリズムは、アルゴリズム自体を離れて使用しての責任です。戦略パターンは、抽象Policyクラスのサブクラスとして、クラス内の戦略のシリーズをパッケージ化するために、通常は一連のアルゴリズムです。
戦略モードは3つの文字が含まれます。
1、環境の役割
戦略戦略への参照を保持しています
2、抽象的な戦略の役割
これは、実装によって抽象的役割、通常、インターフェースまたは抽象クラスで、この役割は、すべてのクラスのインタフェースに必要な具体的な戦略を提供します
3、具体的な戦略の役割
相関アルゴリズムや振る舞いをパッキング
戦略モードの実用的なアプリケーションのシナリオ - フォールトトレラント回復メカニズム
フォールトトレラント回復メカニズムは、アプリケーション開発機能では非常に一般的です。だから、フォールトトレラントは、それを復元何ですか?簡単に言えば、それはこれです:プログラムが実行されると、通常の状況下で、いくつかの方法でエラー発生し、システムが崩壊せず、またこれを下に実行し続けることはできませんを行うにあれば、特定の方法で行われるべきである、とそれだけでなく、ミスを許容する機能があり、エラーを実行している耐えることができる、それはまた、プログラムの通常の実行の機能がダウンして実行し続け交換する回復メカニズムであるエラーの後に代替手段を提供します。
例えば、それの実際の点は、そのようなシステムでは、すべての操作は、ログを持っているだけでなく、ログ管理インターフェースを持っている必要があり、この場合には、通常、その後のを容易にするために、データベースにログインする必要がありますデータベースにログインするときに管理が、しかし、誤差が一時的に、例えば、ROMデータベースを発生することがあり、そのファイルの最初のレコードは、内部、その後適切なタイミングでファイルに記録するようにし、データベースに転写します。
このような設計機能については、データベースに、ログレコードをStrategyパターンを使用することができますし、ポリシーに二つの記録ログとしてログファイル、および運転中に必要に応じて、その後動的に切り替えます。
例
1.ログポリシーのインターフェイスを定義します
1つの パブリック インターフェースLogStrategy { 2 3 公共 ボイドログ(文字列MSG)。 4 5 }
2.ログ・ポリシー・インターフェースを実装
1)データベースにレコード
1つの パブリック クラス DBLOG 実装LogStrategy { 2 3。 公共 ボイドログ(文字列MSG){ 4。 5。 のSystem.out.println( "今'" + MSG + "'データベースにレコード" ) 。6 。7 } 。8 。9 }
2)ファイルにレコード
1つの パブリック クラス filelog 実装LogStrategy { 2 3。 公共 ボイドログ(文字列MSG){ 4。 5。 のSystem.out.println( "今'" "ファイル" + MSG +' ); 6 。7 } 。8 。9 }
これは、特定の戦略アルゴリズムの選択のコンテキストで実装ことに留意されたい3)次に、これらの戦略の使用のコンテキストを定義し、クライアントは、特定の戦略アルゴリズム、次のサンプルコードを指定する必要はありません。
1 パブリック クラスLOGCONTEXT { 2 3 公共 ボイドログ(文字列MSG){ 4 5 LogStrategy戦略= 新しいDBLOG()。 6 トライ{ 7 戦略の.log(MSG)。 8 } キャッチ(例外e){ 9 // 出错、记录到文件 10 戦略= 新しいFileLog()。 11 strategy.log(MSG)。 12 } 13 } 14 }
4.まとめ
上記の例では、簡単なアプリケーション戦略モードでなく、根本的なフォールトトレラント回復機構の設計と実現を見る方法が表示されます。実用的なアプリケーションでは、一般的な要件が高いフォールトトレラント回収システムを設計する必要は、アプリケーションがより複雑になりますが、基本的な考え方は同じです。
戦略・インタフェースのJavaインターフェース-Comparator
たとえば、コレクションのコレクション要素は、内部の複合オブジェクトはなどのプリミティブデータ型ではない複雑なオブジェクトがあるかもしれないので、ソート方法は、ありますが、複合オブジェクトをソートする方法を、大きさに応じて並べ替えることができますか?この問題の考察に基づいて、Javaは複合オブジェクトは、ソート機能を持つように定義されている場合、あなたはコンパレータの一種でオーバーロードされたメソッドを見て、Comparableインタフェースまたはコンパレータインタフェース自体を実装する必要:
1つの 公共 静的 <T> ボイドソート(リスト<T>リスト、コンパレータ<?スーパー T> C){ 2 オブジェクト[] = list.toArray()。 3 は、Arrays.sort((コンパレータ)C); 4 反復子I = list.listIterator()。 5 のための(INT J = 0; J <a.length; J ++ ){ 6 i.next()。 7 i.set([J])。 8 } 9 }
3行目を見てください:
1つの 公共 静的 <T> ボイドソート(T []、コンパレータ<?スーパー T> C){ 2 T [] AUX = (T [])a.clone(); 3 であれば(C == NULL ) 4 マージ(AUX、0、a.length、0 ); 5 そう 6 マージ(AUX、0、a.length、0 、C)。 7 }
6行目で再び見て:
1 プライベート 静的 ボイドマージ(オブジェクト[] SRC、 2 オブジェクト[] DEST、 3 INT低い、INT高く、int型オフ、 4 比較器C){ 5 int型の長さ=ハイ- ロー。 6 7 // 挿入ソート上の最小アレイ 8 であれば(長さ< INSERTIONSORT_THRESHOLD){ 9 ための(int型 I =低; iが高い<; I ++ ) 10 のための(INT J = I; j>は低&& c.compare(DEST [J -1]、DEST [J])> 0; j--) 11 スワップ(DEST、J、J-1 )。 12 リターン; 13 } 14の 15 // SRCにDESTの再帰的ソート半部 16 INT destLow = 低いです。 17 INT destHigh = 高いです。 18 低+ = オフ。 19 ハイ+ = オフ。 20 INT半ば=(ハイロー+)>>> 1 。 21 マージ(DEST、SRC、低、中、 - オフ、C)。 22 マージ(DEST、SRC、中間、高、 - オフ、C)。 23 24 //リストがすでにソートされている場合は、単にSRCからDESTにコピーします。これは、 25 // ほぼ命じたリストのための速い種類になり、最適化。 26 であれば(c.compare(SRC [半ば1]、SRC [中間])<= 0 ){ 27 System.arraycopyの(SRC、低い、DEST、destLow、長さ); 28 リターン; 29 } 30 31 // (現在SRCに)DESTに分類半分をマージ 32 用(INT ; iはi = destLow、P =低、Q =ミッド<destHigh; iは++ ){ 33 であれば(Q> =高||のP <中間&& c.compare(SRC [P]、SRC [Q])<= 0 ) 34 DEST [I] = SRC [P ++ ]; 35 他 36 DEST [I] = SRC [Q ++ ]。 37 } 38 }
ライン10のリターンスワップするかどうかの決定(交換)の結果は、クラスに応じてコンパレータインターフェース方法を比較します。
これは、私たちがコレクションのソート方法に異なる戦略の比較として、異なるコンパレータ実装クラスに渡すことができ、戦略パターンです。異なる結果が生じることがあり、同じコレクションの異なる戦略の比較では、ソートされます。
戦略モードの長所と短所
利点
1、もし...もし他に... else文複数の条件を回避するために、文が複数の状態を維持することは容易ではありません
2、ポリシーモードは、管理関連のアルゴリズムクラスタのアプローチを提供し、公共の継承の適切な使用は、このようにコードの重複を避け、親にコードを置くことができます
短所
1、クライアントはすべてのポリシークラスを知っている必要がありますし、適切なアルゴリズムを選択するために、クライアントはこれらのアルゴリズムの違いを理解しなければならないことを意味し、使用する戦略を決定します
2、代替戦略の多くは、オブジェクトは、大量のデータになる場合