定義:アルゴリズムのセットを定義し、各アルゴリズムをカプセル化し、それらを交換可能にします。
タイプ:行動パターン
クラス図:
ポリシーパターンは、アルゴリズムのカプセル化であり、一連のアルゴリズムを対応するクラスにカプセル化し、これらのクラスは同じインターフェイスを実装し、互いに置き換えることができます。上記の動作クラスモードには、アルゴリズム - テンプレートメソッドモードのカプセル化にも焦点を当てたパターンがあります。クラス図と比較して、ポリシーモードとテンプレートメソッドモードの違いは、個別のカプセル化クラスコンテキストがあることのみであることがわかります。それとテンプレートメソッドモードの違いは次のとおりです。テンプレートメソッドモードでは、呼び出しアルゴリズムの本体は抽象親クラスにありますが、戦略モードでは、呼び出しアルゴリズムの本体がカプセル化クラスのコンテキストにカプセル化されます。抽象戦略戦略は一般にインターフェイスであり、目的は仕様を定義することのみであり、一般にロジックは含まれていません。実際、これは単なる一般的な実装です。実際のプログラミングでは、必然的に各特定の戦略実装クラスの間に同じロジックがあるため、複製コードを回避するために、抽象クラスを使用して戦略の役割を演奏し、パブリックコードをカプセル化することがよくあります。したがって、多くのアプリケーションシナリオでは、テンプレートメソッドパターンの影が戦略モードで一般的に見られます。
政策パターンの構造
カプセル化クラス:コンテキストとも呼ばれますが、ポリシーの二次カプセル化は、高レベルモジュールによるポリシーへの直接の呼び出しを回避するためです。
抽象戦略:通常はインターフェイス。各実装クラスに重複したロジックがある場合、抽象クラスを使用して、共通コードのこの部分をカプセル化します。この時点で、ポリシーパターンはテンプレートメソッドパターンのように見えます。
特定の戦略:特定の戦略の役割は通常、アルゴリズムでカプセル化された一連のクラスによって実行され、これらのクラスは必要に応じて自由に交換できます。
アプリケーションシナリオの例:
Liu Beiは、江と妻と結婚するつもりです。去る前に、Zhuge LiangはZhao Yun(最高の男)に3つのトリックを与え、天国の秘密に従ってそれを分解することで困難な問題を解決するだろうと言った。ねえ、それは本当に大きな問題を解決しました。最終的に、周Yuは彼の妻に同行し、それから彼の軍隊を壊しました。まず、このシーンがどのように見えるか見てみましょう。
まず、このシーンの要素について話しましょう。3つの賢いトリック、1つの巧妙なトリック、1つの巧妙なトリックです。巧妙なトリックは、リアン兄弟によって与えられました。巧妙なトリックは、一般的に巧妙なトリックとして知られています。それから、Zhao Yunは賢いトリックを取り出し、それを実行してから勝つ労働者です。 Javaプログラムを使用してこれらを表現する方法は?
最初に写真を見てみましょうか?
3つのトリックは同じタイプのものですので、インターフェイスを書きましょう。
パッケージcom.yangguangfu.strategy; /**** @author [email protected]:afu*最初に戦略インターフェイスを定義します。これは、Zhuge LiangがZhao Yunに与えた3つのトリックのインターフェースです。 */public Interface istrategy {//すべてのトリックは実行可能なアルゴリズムです。 public void operate(); }
次に、3つの実装クラスを作成します。3つの巧妙なトリックがあります。
賢い計画:WUへの最初の到着:
パッケージcom.yangguangfu.strategy; /**** @author [email protected]:fu* Qiao氏に助けを求めてください。 */ public class Backdoor Implestion iStrategy {@override public void operate(){system.out.println( "古いqiao guoの助けを求めて、ウン・クアンがサン・クアンに圧力をかけて、サン・クアンがliu beiを殺すことができない..."); }}
2番目のトリック:Wu Guotaiに緑色の光を与えて、それを手放してください:
パッケージcom.yangguangfu.strategy; /**** @author [email protected]:fu* wu guotaiに緑色の光を与えてください。 */ public class givengreenlightはiStrategy {@override public void operate(){system.out.println( "guotaiに緑色の光を与えてください、それを手放してください!"); }}
スキル3:サン夫人が後部を切り取り、追跡者をブロックします。
パッケージcom.yangguangfu.strategy; /**** @author [email protected]:afu*ミセス・サンは後部を切り取り、追跡者をブロックしました。 */ public class blackenemyはiStrategy {@override public void operate(){system.out.println( "サンが背中を切り落とし、追跡者をブロックします..."); }}
さて、みんな、3つのトリックがあるので、それらをヒントに置く場所があります:
パッケージcom.yangguangfu.strategy; / ** * * @author [email protected]:afu * */ public class Context {private istrategy Strategy; // Constructor、どのトリックでパブリックコンテキストを使用しますか(iStrategy Strategy){this.strategy = Strategy; } public void operate(){this.strategy.operate(); }}
その後、Zhao Yunは3つのヒントを大いに勇気で運んでいました。すでに高齢者の階級に入り、罪のない少女と結婚したいと思っていた老人Liu Beiを引っ張りました。こんにちは、もちろん、リアン兄弟の3つのトリックは本当に良いです。見て:
パッケージcom.yangguangfu.strategy;パブリッククラスZhaoyun { /*** Zhao Yunが登場しました。 Zhuge Liangの彼への説明によれば、彼はトリックを順番に分解しました*/ public static void main(string [] args){Context Context; //私が最初にWUに到着したとき、私は最初のsystem.out.println( "----------------------------------------------)を分解しました。 Context = new Context(new Backdoor()); context.operate(); // system.out.println( "/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n"); //When Liu Bei was happy to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be嫌悪になりたくないことを嫌がらないことを嫌がらないことを嫌がないで、嫌悪になりたくないことを嫌がらないことを嫌がらないことを嫌がらないことを嫌がらないことを嫌がらないことを嫌がらないことを嫌がらないことを嫌がらないことを嫌がらないことを嫌がらないことに嫌悪したくないことに嫌悪したくないことを嫌がらないことに嫌悪になりたくないことを嫌いになりたくないことを嫌がらないことを嫌がらないことを嫌がりたいと思っていない。 Context = new Context(new Blackenemy()); context.operate(); //分解して実行しますSystem.out.println( "/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n
ポリシーモードの利点と短所ポリシーモードの主な利点は次のとおりです。
ポリシークラスは自由に切り替えることができ、ポリシークラスは同じ抽象化を実装するため、自由に切り替えることができます。
拡張が簡単で、新しいポリシーを追加することはポリシーモデルにとって非常に簡単であり、基本的に元のコードを変更せずに拡張できます。
複数の条件を使用しないでください。すべてのアルゴリズムについて、ポリシーモードを使用しない場合、接続するために条件付きステートメントを使用し、条件付き判断を通じて使用するアルゴリズムを使用する必要があります。前の記事では、複数の条件付き判断を使用することは維持が非常に困難であると述べました。
戦略モデルには2つの主な欠点があります。
さまざまなポリシークラスを維持することで、開発に追加のオーバーヘッドがもたらされます。この点で経験があるかもしれません。一般的に言えば、ポリシークラスの数は5を超えていますが、これはより厄介です。
すべてのポリシークラスは、使用するのはクライアント次第であるため、クライアント(発信者)にさらされる必要があります。そのため、クライアントはどのポリシーがあるかを知り、さまざまなポリシーの違いを理解する必要があります。そうでなければ、結果は深刻です。たとえば、3つのアルゴリズムを提供するアルゴリズムをソートするための戦略モデルがあります:クイックソート、バブルソート、選択ソートの選択。クライアントがこれらのアルゴリズムを使用する前に、これらの3つのアルゴリズムの適用を理解する必要がありますか?たとえば、クライアントは、リンクされたリストと配列によって実装されるコンテナを使用する必要があります。また、クライアントはリンクされたリストと配列の違いを理解する必要がありますか?この点で、それはディミティアの法律に反しています。
適用可能なシナリオ
オブジェクト指向の設計を実行する場合、オブジェクト指向の継承と多型であるため、ポリシーパターンに非常に精通している必要があります。ポリシーパターンの一般的なコードを読んだ後、ポリシーパターンを聞いたことがなくても、開発プロセス中に使用したに違いないと思いますよね?少なくとも次の2つの状況では、戦略モデルの使用を検討できます。
いくつかのクラスの主なロジックは同じであり、部分論理のアルゴリズムと動作にはわずかな違いしかありません。
いくつかの同様の動作、またはアルゴリズムがあり、クライアントはどの使用法を使用するかを動的に決定する必要があるため、ポリシーパターンを使用してこれらのアルゴリズムをカプセル化して、クライアントが呼び出すことができます。
戦略モデルは、シンプルで一般的に使用されるモデルです。私たちが開発しているとき、私たちはしばしば意図的または意図せずにそれを使用します。一般的に言えば、戦略モデルは単独では使用されず、テンプレートメソッドモード、ファクトリーモードなどで混合して使用する方が一般的です。