【java設計モード】のポリシー(strategy)モード


戦略モデルは実際に使用されていることが多いので、まず1つのシーンを見てみましょう.ある市場関係者が注文を受けた後のオファー戦略は、価格保証戦略が複雑ですが、簡単に次のように分類することができます.
新しい取引先の小ロットのオファー新しい取引先の大量のオファー古い取引先の小ロットのオファー古い取引先の大量のオファー
具体的にどのオファーポリシーを選択するかは、実際の状況に応じて決定する必要があります.この場合、ポリシーモデルを採用すれば、この問題を解決できます.この問題では、ポリシーモデルを採用しなければどう処理されますか?if判断やswitch...case...を使って解決し、ユーザーによって異なるオファーを確定するのは自然です.次のような構成です.
public double getPrice(String type, double price) {

    if(type.equals("      ")) {
        //       
        return price;
    } else if(type.equals("      ")) {
        //       
        return price;
    } 
    //......
}

あるいはswitchを使う...case….,しかし明らかに弊害があり、このタイプは特に多く、各タイプには独自のアルゴリズムがあり、アルゴリズムが複雑であれば条件全体の制御コードが長くなり、メンテナンスが困難になる.この問題を解決するために、ポリシーモードを使用することができます.ポリシーモード:すなわち、ある問題を解決するアルゴリズムファミリーに対応し、ユーザーがそのアルゴリズムファミリーから1つのアルゴリズムを選択してある問題を解決することを可能にすると同時に、アルゴリズムを簡単に交換したり、新しいアルゴリズムを追加したりすることができ、クライアントによってどのアルゴリズムを呼び出すかを決定することができ、まずポリシーのインタフェースがあり、次に、異なる4つの異なるポリシーがそれぞれこのインタフェースのメソッドを実現します.ここではオファーのメソッドです.次に、特定のポリシーを操作するためのコンテキストクラスを定義します.クライアントはこのコンテキストと付き合うだけでいいです.つまり、ポリシーをコンテキストクラスに渡すだけで、対応するポリシーを実行することができます.後期に変更または追加する必要がある場合は、特定のポリシー実装クラスを変更したり、実装クラスを追加したりするだけで、メンテナンスが容易になります.プログラムの実装を見てみましょう.
//    
public interface Strategy {

    public double getPrice(double standardPrice);

}

4つの異なるポリシー実装クラス:
//       
public class NewCustomerFewStrategy implements Strategy {

    @Override
    public double getPrice(double standardPrice) {

        System.out.println("      ,   ");
        return standardPrice;
    }

}

//       
public class NewCustomerManyStrategy implements Strategy {

    @Override
    public double getPrice(double standardPrice) {

        System.out.println("      ,   ");
        return standardPrice * 0.9;
    }

}

//       
public class OldCustomerFewStrategy implements Strategy {

    @Override
    public double getPrice(double standardPrice) {

        System.out.println("      ,   ");
        return standardPrice * 0.8;
    }

}

//       
public class OldCustomerManyStrategy implements Strategy {

    @Override
    public double getPrice(double standardPrice) {

        System.out.println("      ,   ");
        return standardPrice * 0.7;
    }

}

次にコンテキストクラスが表示されます.
/** * @Description           ,              。 * @author Ni Shengwu * */
public class Context {

    private Strategy strategy;

    //              ,   Spring,       @Resource    
    public Context(Strategy strategy) {
        super();
        this.strategy = strategy;
    }

    public void getPrice(double standardPrice) {
        System.out.println("   :" + strategy.getPrice(standardPrice));
    }

}

テスト:
public class Client {

    public static void main(String[] args) {

        Strategy s1 = new OldCustomerManyStrategy();
        Context ctx = new Context(s1); //          

        ctx.getPrice(1000);
    }

}

出力結果:
古い取引先の大量量、2割引のオファーは:700.0です
実際には,ポリシーモードはspringにおいても有用であり,注釈@Resourceによりこのモードを用い,どちらを注入してもどちらを用いる.  
-分かち合い、共に進歩する!-私のブログのホームページ:http://blog.csdn.net/eson_15