定義了一系列的算法,并将每一個算法封裝起來,而且使它們還可以互相替換。政策模式讓算法獨立于使用它的客戶而獨立變化。
政策模式
通俗一點來說就是把 if 判斷語句給封裝了,提高了代碼的擴充性和可維護性. 對外隐藏了具體的算法實作.
?示意圖:
三個角色:
● 環境(Context)角色:持有一個Strategy的引用。
● 抽象政策(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實作。此角色給出所有的具體政策類所需的接口。
● 具體政策(ConcreteStrategy)角色:包裝了相關的算法或行為。
這個圖有點類是于門面模式,但是值得注意的是?門面模式是對所有方法進行一個封裝.這裡隻是對某個方法.
應用場景
政策模式的用意是針對一組算法或邏輯,将每一個算法或邏輯封裝到具有共同接口的獨立的類中,進而使得它們之間可以互相替換。政策模式使得算法或邏輯可以在不影響到用戶端的情況下發生變化。說到政策模式就不得不提及OCP(Open Closed Principle) 開閉原則,即對擴充開放,對修改關閉。政策模式的出現很好地诠釋了開閉原則,有效地減少了分支語句。
代碼案例
此代碼通過模拟不同會員購物車打折力度不同分為三種政策,初級會員,中級會員,進階會員。
✍上代碼:
//政策模式 定義抽象方法 所有支援公共接口
abstract class Strategy {
// 算法方法
abstract void algorithmInterface();
}
public class StrategyA extends Strategy {
@Override
void algorithmInterface() {
System.out.println("算法A");
}
}
public class StrategyB extends Strategy {
@Override
void algorithmInterface() {
System.out.println("算法B");
}
}
/**
* 中間層的Context類實作了對底層實作的隐藏,更符合設計模式開閉的思想
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
Context context;
context = new Context(new StrategyA());
context.algorithmInterface();
context = new Context(new StrategyB());
context.algorithmInterface();
}
}
政策模式的優點:
- 算法可以自由切換;
- 避免使用多重條件判斷;
- 擴充性良好。
政策模式的缺點:
- 政策類會增多
- 所有政策類都需要對外暴露
總結
政策模式的本質:
分離算法,選擇實作。
如果你仔細思考政策模式的結構和功能的話,就會發現:如果沒有上下文,政策模式就回到了最基本的接口和實作了,隻要是面向接口程式設計,就能夠享受到面向接口程式設計帶來的好處,通過一個統一的政策接口來封裝和分離各個具體的政策實作,無需關系具體的政策實作。
政策模式展現了開閉原則:政策模式把一系列的可變算法進行封裝,進而定義了良好的程式結構,在出現新的算法的時候,可以很容易的将新的算法實作加入到已有的系統中,而已有的實作不需要修改。
政策模式展現了裡氏替換原則:政策模式是一個扁平的結構,各個政策實作都是兄弟關系,實作了同一個接口或者繼承了同一個抽象類。這樣隻要使用政策的用戶端保持面向抽象程式設計,就可以動态的切換不同的政策實作以進行替換。