java23デザインパターン - 戦略パターン

戦略パターンの1つの構造

戦略モードアルゴリズムのパッケージである、とアルゴリズムの使用は、異なるオブジェクトの管理に委任セグメンテーションアルゴリズム自体オフの責任です。Strategyパターンは、通常、一連のアルゴリズムは、抽象的な政策サブクラスとして、クラス内の戦略のシリーズをパッケージ化します。一つの文は、それは次のようになります。「彼らは交換可能になるように、アルゴリズムのセット、各アルゴリズムを準備し、カプセル化されました。」ここで概略を実現パターンインスタンスポリシーの構造を説明します。

このモデルは、3つの役割が含まれます。

  ●   環境(コンテキスト)役割:戦略への参照を保持します。

  ●   抽象戦略(ストラテジー)の役割:これは通常、インターフェースや抽象クラスによって実装、抽象的役割です。このロールは、すべてのクラスのインターフェイスに必要な具体的な戦略を提供します。

  ●   具体的な戦略(ConcreteStrategy)役割:関連するアルゴリズムや振る舞いをパッケージ化。

コード例2

環境クラスの役割

public class Context {
    //持有一个具体策略的对象
    private Strategy strategy;
    /**
     * 构造函数,传入一个具体策略对象
     * @param strategy    具体策略对象
     */
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    /**
     * 策略方法
     */
    public void contextInterface(){
        
        strategy.strategyInterface();
    }
    
}
复制代码

アブストラクト

public interface Strategy {
    /**
     * 策略方法
     */
    public void strategyInterface();
}
复制代码

具体的な戦略

public class ConcreteStrategyA implements Strategy {

    @Override
    public void strategyInterface() {
        //相关的业务
    }
}
复制代码
public class ConcreteStrategyB implements Strategy {

    @Override
    public void strategyInterface() {
        //相关的业务
    }
}
复制代码
public class ConcreteStrategyC implements Strategy {

    @Override
    public void strategyInterface() {
        //相关的业务
    }
}
复制代码

3つの使用シナリオ

ブックのすべての種類の販売が電子商取引のウェブサイトのショッピングカートシステムを設計することになりましたとします。最も簡単な例の一つは、数を乗じたすべての商品の単価を置くことですが、実際の状況は確かにそれよりも複雑です。たとえば、このサイトでは、各プロモーション割引のこの20%のすべての幹部を提供することができる。ジュニアのメンバーのための割引なし、このプロモーション各中間部材10%割引を提供します。

  説明によると、割引が数次のアルゴリズムに基づいています。

  アルゴリズム1:ジュニアのメンバーのための割引はありません。

  アルゴリズムII:中間部材10%割引のプロモーションを提供します。

  アルゴリズムIII:シニアメンバーのための20%割引プロモーション。

  戦略は、モデル構造を使用して実装は次のとおりです。

3.1コード

抽象クラス割引

public interface MemberStrategy {
    /**
     * 计算图书的价格
     * @param booksPrice    图书的原价
     * @return    计算出打折后的价格
     */
    public double calcPrice(double booksPrice);
}
复制代码

ジュニア会員割引カテゴリ

public class PrimaryMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {
        
        System.out.println("对于初级会员的没有折扣");
        return booksPrice;
    }
}
复制代码

中間部材割引カテゴリ

public class IntermediateMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {

        System.out.println("对于中级会员的折扣为10%");
        return booksPrice * 0.9;
    }
}
复制代码

シニアクラスのメンバー割引

public class AdvancedMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {
        
        System.out.println("对于高级会员的折扣为20%");
        return booksPrice * 0.8;
    }
}
复制代码

プライスクラス

public class Price {
    //持有一个具体的策略对象
    private MemberStrategy strategy;
    /**
     * 构造函数,传入一个具体的策略对象
     * @param strategy    具体的策略对象
     */
    public Price(MemberStrategy strategy){
        this.strategy = strategy;
    }
    
    /**
     * 计算图书的价格
     * @param booksPrice    图书的原价
     * @return    计算出打折后的价格
     */
    public double quote(double booksPrice){
        return this.strategy.calcPrice(booksPrice);
    }
}
复制代码

クライアント

public class Client {

    public static void main(String[] args) {
        //选择并创建需要使用的策略对象
        MemberStrategy strategy = new AdvancedMemberStrategy();
        //创建环境
        Price price = new Price(strategy);
        //计算价格
        double quote = price.quote(300);
        System.out.println("图书的最终价格为:" + quote);
    }

}
复制代码

上記の例からわかるように、ポリシーモデルのカプセル化アルゴリズムは、既存のシステムに挿入された新しいアルゴリズムを提供し、古いシステム「引退」方法からアルゴリズムは、ポリシーモデルは、ときに使用するアルゴリズムを決定するわけではありません。どのようなアルゴリズムどのような状況の下で使用するためには、クライアントによって決定されます。

4 Strategyパターンを認識

戦略パターンの焦点

  戦略モードの焦点は、アルゴリズムを実装する方法ではなく、プログラムの構造をより柔軟になるように、これらのアルゴリズムを呼び出すために、より優れた保守性とスケーラビリティを整理する方法。

アルゴリズムの平等

  戦略モードが大きな特徴である各ポリシーアルゴリズムの平等です。この等式は、アルゴリズムの間で互換性を実現することができますので、具体的な戦略アルゴリズムのシリーズでは、我々の立場は、まったく同じです。実装上のすべてのアルゴリズムポリシーは、彼らが相互に依存しない、また、互いに独立です。

  だから我々は戦略アルゴリズムのこのシリーズを記述することができます。アルゴリズムは、同じ動作を達成するための様々な戦略です。

一意性ポリシーの実行時

  動作中に、唯一の特定の戦略各時間におけるポリシーモデルは、動的ポリシーの異なる実装の間で切り替えることができるが、目的を達成するため、だけ一方を使用します。

公共の行動

  多くの場合、特定のポリシークラスのすべては、いくつかの公共の振る舞いを持っているということです参照してください。この時点で、我々は内部の共通の戦略的役割-戦略抽象クラスにこれらのパブリック行動を置く必要があります。もちろん、この時抽象的な戦略役割を使用することができないインタフェースを実装するJava抽象クラスを使用する必要があります。

  実は、これは標準的な慣行は、継承の上方階層に焦点を当て、典型的なコードです。

戦略パターンの5つの利点

(1)戦略モード管理アプローチに係るアルゴリズムのファミリーを提供します。クラス階層戦略は、アルゴリズムや行動の家族を定義します。適切な使用の継承は、共通の親クラスコード、繰り返しを避けるために、コードに移動することができます。

  (2)複数の条件(IF-ELSE)ステートメントを使用しないように戦略パターンを使用します。複数の条件文は、維持するすべての継承を使用する方法よりも内側に、また生および逆多重条件文に記載されている、一緒に混合する行為を取る論理および算術演算または論理または動作アルゴリズムにそれを取ることは容易ではありません。

戦略パターンの6欠点

 (1)クライアントは、すべてのポリシークラスを知っている必要がありますし、クラスが使用する戦略を決定します。これは、クライアントが適時に適切なアルゴリズムのクラスを選択するために、これらのアルゴリズムの違いを理解しなければならないことを意味します。言い換えれば、ポリシーモードは、クライアントが、アルゴリズムや行動を知っている場合にのみ使用可能です。

  各特定の戦略のためのモードポリシーを個別のクラスにパッケージ実装ので、(2)、多くの代替戦略場合、オブジェクトの数が非常に著しいであろう。

おすすめ

転載: juejin.im/post/5ceb38016fb9a07ee565fc4b