天天看點

Java描述設計模式(22):政策模式一、生活場景二、政策模式三、政策模式總結四、源代碼位址

本文源碼: GitHub·點這裡 || GitEE·點這裡

一、生活場景

每年雙十一,各大電商平台會推出不同的滿減政策,當使用者的消費金額滿一定額度後,會進行減去一定的優惠額度,進而來一波清倉甩賣,使用政策模式來描述該流程。

public class C01_InScene {
    public static void main(String[] args) {
        // 選擇滿減政策,走相應的計算方式
        FullReduce strategy = new Full100 ();
        Payment price = new Payment(strategy);
        double quote = price.payment(300);
        System.out.println("最終價格為:" + quote);
    }
}
/**
 * 付款
 */
class Payment {
    private FullReduce fullReduce ;
    public Payment (FullReduce fullReduce){
        this.fullReduce = fullReduce ;
    }
    public double payment (double totalPrice){
        return this.fullReduce.getPayMoney(totalPrice) ;
    }
}
/**
 * 金額滿減接口
 */
interface FullReduce {
    double getPayMoney (double totalPrice) ;
}
/**
 * 不同的滿減政策
 */
class Full100 implements FullReduce {
    @Override
    public double getPayMoney(double totalPrice) {
        if (totalPrice >= 100){
            totalPrice = totalPrice-20.0 ;
        }
        return totalPrice ;
    }
}
class Full500 implements FullReduce {
    @Override
    public double getPayMoney(double totalPrice) {
        if (totalPrice >= 500){
            totalPrice = totalPrice-120.0 ;
        }
        return totalPrice ;
    }
}           

二、政策模式

1、基礎概念

政策模式屬于對象的行為模式。政策模式中定義算法族,分别封裝起來,讓他們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客 戶端。

2、模式圖解

Java描述設計模式(22):政策模式一、生活場景二、政策模式三、政策模式總結四、源代碼位址

3、核心角色

  • 環境角色
持有一個Strategy政策接口角色的引用。
  • 抽象政策角色
通常由一個接口或抽象類實作。此角色給出所有的具體政策類要實作的接口。
  • 具體政策角色
包裝相關的算法或業務流程。

4、源碼實作

public class C02_Strategy {
    public static void main(String[] args) {
        Strategy strategy = new ConcreteStrategyB() ;
        Context context = new Context(strategy) ;
        context.userMethod();
    }
}
/** 環境角色類 */
class Context {
    //持有一個具體政策的對象
    private Strategy strategy;
    /**
     * 構造函數,傳入一個具體政策對象
     * @param strategy    具體政策對象
     */
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    public void userMethod (){
        this.strategy.strategyMethod();
    }
}
/** 抽象政策類 */
interface Strategy {
    // 政策方法
    void strategyMethod () ;
}
/** 具體政策類 */
class ConcreteStrategyA implements Strategy {
    @Override
    public void strategyMethod() {
        System.out.println("政策A方法");
    }
}
class ConcreteStrategyB implements Strategy {
    @Override
    public void strategyMethod() {
        System.out.println("政策B方法");
    }
}           

三、政策模式總結

政策模式的關鍵是:變化的與不變分離,展現了“對修改關閉,對擴充開放”原則。用戶端增加行為不用修改原有代碼,隻要添加一種政策即可,易于切換、易于了解、易于擴充。政策過多是會導緻類數目龐大,變得難以維護。

四、源代碼位址

GitHub·位址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·位址
https://gitee.com/cicadasmile/model-arithmetic-parent