デザインパターン(1) - 戦略モード

アドレス重版の記事:  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と、
        } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/liweiweicode/p/11570550.html