一、 什麼是政策模式
它對一系列的算法加以封裝,為所有算法定義一個抽象的算法接口,并通過繼承該抽象算法接口 對所有的算法加以封裝和實作,具體的算法選擇 交由用戶端決定(政策)。

二、 政策模式的角色
1、環境(Context)角色: 持有一個Strategy的引用。
2、抽象政策(Strategy)角色: 這是一個抽象角色,通常由一個接口或抽象類實作。此角色給出所有的具體政策類所需的接口。
3、具體政策(ConcreteStrategy)角色: 包裝了相關的算法或行為。
三、政策模式的優缺點
優點:
1、代碼中的if、switch判斷邏輯可以去掉;
2、代碼優雅、可複用、可讀性好、便于維護;
3、政策模式遵循開閉原則,實作代碼的解耦合;
缺點:
1、 政策如果很多的話就會出現很多政策類,會造成政策類膨脹;
2、 使用者必須清楚所有的政策類及其用途;
四、政策模式的實作
政策模式的用意是針對一組算法,将每一個算法封裝到具有共同接口的獨立的類中,進而使得它們可以互相替換。
政策模式使得算法可以在不影響到用戶端的情況下發生變化。使用政策模式可以把行為和環境分割開來。
環境類負責維持和查詢行為類,各種算法則在具體政策中提供。由于算法和環境獨立開來,算法的修改不會影響環境和用戶端。
五、政策模式的編寫步驟
1.對政策對象定義一個公共接口。
2.編寫政策類,該類實作了上面的公共接口。
3.在使用政策對象的類中儲存一個對政策對象的引用。
4.在使用政策對象的類中,實作對政策對象的set和get方法(注入)或者使用構造方法完成指派。
六、實列
抽象折扣類
public interface MemberStrategy {
/**
* 計算原油的價格
* @param crudeOilPrice 原油的原價
* @return 計算出打折後的價格
*/
double calcPrice(double crudeOilPrice);
}
初級會員折扣類
public class PrimaryMemberStrategyImpl implements MemberStrategy {
@Override
public double calcPrice(double crudeOilPrice) {
System.out.println("對于初級會員的沒有折扣");
return crudeOilPrice;
}
}
中級會員折扣類
public class IntermediateMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double crudeOilPrice) {
System.out.println("對于中級會員的折扣為10%");
return crudeOilPrice * 0.9;
}
}
進階會員折扣類
public class AdvancedMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double crudeOilPrice) {
System.out.println("對于進階會員的折扣為20%");
return crudeOilPrice * 0.8;
}
}
貴賓會員折扣類
public class VisitantMemberStrategy implements MemberStrategy {
@Override
public double calcPrice(double crudeOilPrice) {
System.out.println("對于貴賓會員的折扣為25%");
return crudeOilPrice * 0.75;
}
}
價格類
public class Price {
//持有一個具體的政策對象
private MemberStrategy strategy;
/**
* 構造函數,傳入一個具體的政策對象
* @param strategy 具體的政策對象
*/
public Price(MemberStrategy strategy){
this.strategy = strategy;
}
/**
* 計算原油的價格
* @param crudeOilPrice 原油的原價
* @return 計算出打折後的價格
*/
public double quote(double crudeOilPrice){
return this.strategy.calcPrice(crudeOilPrice);
}
}
總結:if else作為每種程式設計語言都不可或缺的條件語句,在程式設計時會大量的用到。一般建議嵌套不要超過三層,如果一段代碼存在過多的if else嵌套,代碼的可讀性就會急速下降,後期維護難度也大大提高,可以利用政策模式來替代if/else。