本文源碼: 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、模式圖解

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