Android開発における戦略設計モデルの応用


1.パターン定義
一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、互いに置き換えることができるようにします.ポリシー設計モードにより、アルゴリズムは、使用するお客様とは独立して独立して変化することができます.
2.ポリシーの例
もし私たちが財テク製品を作るならば、支付宝と微信の2つの支払いルートがあって、2つのルートの金額のアルゴリズムは異なっていて、この時もう1つの工行の支払いルートあるいは後で更に多くのルートがあって、各ルートの金額のアルゴリズムが異なっている時、この時策略の設計モードを使って各ルートの金額のアルゴリズムをカプセル化して、筋道がはっきりしています.万一、あるチャネルのアルゴリズムが変更された場合、そのチャネルのアルゴリズムを直接修正することもできます.
仮に私达が1元の価格の100商品があると仮定して、各ルートはすべて优遇があって、しかし优遇力道は异なって、支付宝は优遇します:元の価格-(元の価格/10)、微信の优遇は://元の価格-(元の価格/20)、工行の优遇は:元の価格-0.1で、それでは策略の设计のモードの书き方は以下の通りです.
価格ポリシーインタフェースIPriceを定義する.java
public interface IPrice {
    double price(double originPrice);
}

それぞれ3種類の支払い方式は価格の策略のインタフェースを実現して、具体的な策略の実現、金額のアルゴリズムをその中に書きます
public class AliPayPrice implements IPrice {
    @Override
    public double price(double originPrice) {
        //   -(  /10)
        BigDecimal discountPrice = new BigDecimal(originPrice).divide(new BigDecimal(10), 2, BigDecimal.ROUND_HALF_UP);
        return new BigDecimal(originPrice).subtract(discountPrice).doubleValue();
    }
}
public class WechatPayPrice implements IPrice {
    @Override
    public double price(double originPrice) {
        //   -(  /20)
        BigDecimal discountPrice = new BigDecimal(originPrice).divide(new BigDecimal(20), 2, BigDecimal.ROUND_HALF_UP);
        return new BigDecimal(originPrice).subtract(discountPrice).doubleValue();
    }
}
public class GonghangPayPrice implements IPrice {
    @Override
    public double price(double originPrice) {
        //    - 0.1
        return originPrice - 0.1d;
    }
}

コンテキストロールを確立し、ポリシーのコンテキスト環境を操作し、上位モジュールのポリシー、アルゴリズムへの直接アクセスを遮断する役割を果たします.
public class PriceContext {
    private IPrice iPrice;

    public PriceContext(IPrice iPrice) {
        this.iPrice = iPrice;
    }

    public double price(double originPrice) {
        return this.iPrice.price(originPrice);
    }
}

3.テスト実装
開発クライアントでは
public class AppClient {
    public static void main(String[] args){
        double originPrice = 100d;
        AliPayPrice aliPayPrice = new AliPayPrice();
        PriceContext priceContext = new PriceContext(aliPayPrice);
        System.out.println("price = "+ priceContext.price(originPrice));    //   :price = 90.00
        WechatPayPrice wechatPayPrice = new WechatPayPrice();
        priceContext = new PriceContext(wechatPayPrice);
        System.out.println("price = "+ priceContext.price(originPrice));    //   :price = 95.00
        GonghangPayPrice gonghangPayPrice = new GonghangPayPrice();
        priceContext = new PriceContext(gonghangPayPrice);
        System.out.println("price = "+ priceContext.price(originPrice));    //   :price = 99.90
    }
}