アドレス重版の記事: https://www.jianshu.com/p/3bcf55cf83d3
まず、ビジネスシナリオ:
1は、鳥があり、そのような飛行と呼ばれる、異なる音として鳥共通の属性、あなたは不動産事業の拡大だけでなく、鳥が食べたときに、親クラスが、書き換えられサブクラス化することができ、
しかし、別の鳥は、別の何かを食べて、いくつかのクラスのように、この方法は、それを解決する方法を、必要としませんか?、。サブクラスはスーパークラスのメソッドをオーバーライドしますが、実装され、複数のクラスが存在する場合に
B、あまりにも面倒を変更します。鳥の種類を食べるときに、異なる達成するために、異なる実装クラスを呼び出して、食べるために統一されたインタフェースを達成するために、さまざまな食品のやり方を食べる、食べるために統一されたインタフェースを定義します
鳥はさまざまな方法を食べます。
2は、あなたがメインクラスにメソッドを追加する必要があるときに、古いクラス、サブクラスは結局継承し、このメソッドを呼び出しますが、すべてのサブクラスは、このメソッドを実装する必要はない、この時間は、我々は新しい方法を考える必要がありますA:
1 )、この新しい方法では、各サブカテゴリーに書き換えること--- 「あまりにも多くの問題を、コード再利用性が高くありません、
2 )動作(定義するインターフェースを、行動の特定の実装は、アヒルの呼び出しを含める、同じではない):ガガは、呼び出さGUGU 挙動は同じではない実現するために呼び出され、具象サブクラスを、方法の究極の表現は同じではありません
二、类图
第三に、共通のコードを達成するために:
クラスクライアント{ 公共 静的 ボイドメイン(文字列[]引数){ // 特定のポリシーを選択 IStrategy戦略= 新しい新しい)ConcreteStrategyAを(; // のコンテキストへ =コンテキストコンテキスト新しい新しいコンテキスト(戦略); // コンテキストから直接クライアントアルゴリズム実行環境 context.algorithm(); } // 抽象戦略戦略 インターフェースIStrategy { ボイドアルゴリズム(); } // 詳細な戦略ConcreteStrategy 静的 クラス ConcreteStrategyA 実装IStrategy { @Override 公共 ボイドアルゴリズム(){ System.out.printlnは( "戦略A" )。 } } // 具体策略类ConcreteStrategy 静的 クラス ConcreteStrategyBが実装IStrategy { @Override 公共 ボイドアルゴリズム(){ System.out.printlnは( "戦略Bを" )。 } } // 上下文环境 静的 クラスコンテキスト{ プライベートIStrategy mStrategy。 公共コンテキスト(IStrategy戦略){ この.mStrategy = 戦略。 } 公共 ボイドアルゴリズム(){ この.mStrategy.algorithm()。 } } }
ストラテジストは、if..elseを使用しないよう、算術モードを実現...ので、コードの冗長性を引き出します
モード Whynの 懸念は、 サポートに感謝 戦略モードを 0.723 2018年10月27日午前23時31分27秒 ワードカウント 1093 読書 4496 プロフィールが 各カプセル化、アルゴリズムのファミリーを定義します 。1を、そしてそれらを交換可能にする アルゴリズムのセットを定義し、各アルゴリズムは、一緒にパッケージされており、あなたはそれらの間で交換することができます。 戦略モードもポリシーとして知られている(Strategyパターン)モード、(政策・パターン)。それは動作するオブジェクトを指しますが、別のシナリオでは、行為は別のアルゴリズムを持っています。たとえば、彼の給料に関連する人物の税率は、別の賃金水準は異なる税率に相当します。 戦略モードは、異なるシナリオに異なる実装と同じ動作を達成するために、オブジェクト指向継承及び多型の機構を用いています。 Strategyパターンの自然:分離アルゴリズム、実装することを選択した 主なソリューション 、アルゴリズム同様の例様々なを使用IF ... 他にまたはスイッチ ... ケース、複雑で面倒な自然がもたらします。 欠点の 利点は、 アルゴリズムの多様性、および無料のスイッチング機能を持っています。 エラーの確率を減少させる、操作を簡素化し、複数の条件、強化カプセル化を効果的に回避します。 優れたスケーラビリティ、代替原則戦略のコンプライアンス徐リヒター、簡単にポリシー拡張を行うことができます; の欠点 ポリシークラス数の増加、およびすべての戦略クライアントが選択できるように、外部に露出されなければならない。 シナリオを使用し 、問題の同じタイプのために、独立して問題を解決することができ、それぞれが様々なトリートメントが、ある; アルゴリズムは、シーンの切り替えに自由を必要とする、 アルゴリズムの規則にシーンをマスキングする必要; モデルを説明します 一般的なUMLのクラス図は、最初の戦略パターンを見て: 戦略パターン :UMLのクラス図から、我々は戦略パターンは三つの主要な役割が含まれていることを確認することができ 、コンテキストのロール(コンテキスト):政策遮光層モジュールのコンテキストを操作するために使用します(クライアント)の戦略、アルゴリズムへの直接アクセスは、パッケージには、可能な変更、 抽象的な戦略の役割(戦略):行動戦略やアルゴリズムの規定; 具体的な戦略の役割(ConcreteStrategy):具体的な戦略やアルゴリズムを、 以下の戦略パターンであります汎用コード: クラスのクライアント{ 公共の 静的 ボイドメイン(文字列[]引数){ // 特定のポリシーを選択 IStrategy戦略= 新しい新規のConcreteStrategyA(); //コンテキストへ コンテキスト=コンテキスト新しい新しいコンテキスト(戦略); // コンテキストから直接実行されるクライアント・アルゴリズム context.algorithm(); } // 抽象戦略戦略 インターフェースIStrategy { ボイドアルゴリズム(); } // 詳細な戦略ConcreteStrategy 静的 クラス ConcreteStrategyA 実装IStrategy { @Override 公共 ボイドアルゴリズム(){ System.out.printlnは( "戦略" ); } } // 詳細な戦略ConcreteStrategy クラス静的 ConcreteStrategyBは実装IStrategy { @Override 公共 ボイドアルゴリズム(){ (のSystem.out.println "戦略Bを" )。 } } // 上下文环境 静的 クラスコンテキスト{ プライベートIStrategy mStrategy。 公共コンテキスト(IStrategy戦略){ この .mStrategy = 戦略。 } 公共 ボイドアルゴリズム(){ この.mStrategy.algorithm()。 } } } 举个例子 例:2つの数値を操作するためにオペレータを必要とする、オペレータとの二つの数があると仮定する。 分析:直接アイデア:,これら2つの数字が計算演算子記号を実行することによって決定されます。コード次のように 静的 クラス電卓{ プライベート 静的 最終列SYMBOL_ADD = "+" ; プライベート 静的 最終列SYMBOL_SUB = " - " ; 公共 int型のCalc(int型 A、int型 B、最終列のシンボル){ int型の結果= 0 ; IF (SYMBOL_ADD.equals(シンボル)){ 結果 = A + B; } そう IF (SYMBOL_ADD.equals(シンボル)){ 結果 = A - B; } 戻り結果; } } この書き込み、我々は乗算拡張する場合 *又は分割/ 計算値に対応する方法を大きくする必要がある場合は、動作を制御します。 ..else判定コードの膨張と低スケーラビリティ。 ポリシーモードを使用する場合、以下のように様々なオペレータが対応する特定のポリシーに統合されているので、コードを簡略化し、非常に良好なスケーラビリティをもたらすことができ、特定のコード計算: クラスクライアント{ 公共 静的 ボイドメイン(文字列[]引数){ ICalculator電卓 = 新しい新規追加(); コンテキストコンテキスト = 新しい新しいコンテキスト(計算); int型の結果= context.calc(1,2 )。 System.out.println(結果)。 } インターフェイスICalculator { int型の計算値(INT A、INT B)。 } 静的 クラスの追加を実装ICalculator { @Override 公衆 INT Calcは(INT A、INT B){ 返す + ; Bは } } 静的 クラスのサブ実装ICalculator { @Override 公共 のint Calcは(INT A、INT B){ 返す - ; B } } 静的 クラスマルチ実装ICalculator { @Override 公衆 INT Calcは(INT A、INT B){ 戻り *のBと、 } } 静的 クラス分割は実装ICalculator { @Override 公共 int型の計算値(int型、int型の{B)を 返す / B。 } } 静的 クラスのコンテキスト{ プライベートICalculator mCalculator。 公共コンテキスト(ICalculator算出){ この .mCalculator = 電卓。 } 公共 int型の計算値(INT A、INT B){ 戻り 、この(B).mCalculator.calcと、 } } }