在介紹政策模式之前先說下兩個設計原則:
1. Identify the aspects of your application that vary and separate them from what stays the same.找到系統中變化的部分,将變化的部分同其它穩定的部分隔開。
2. Program to an interface, not an implementation.面向接口程式設計,而不要面向實作程式設計。
那什麼是政策模式呢?
The Strategy Pattern defines a family of algorithms ,encapsulates each one , and makes them interchangeable. Strategy lets the algorithms vary independently from clients that use it.什麼意思呢?就是說政策模式定義了一系列的算法,并将每一個算法封裝起來,而且使它們還可以互相替換。政策模式讓算法獨立于使用它的客戶而獨立變化。
舉個例子:假設我們現在要為聯想公司做個計算公司員工工資的電腦,我們知道聯想是個國際化公司,在中國和美國都有員工,由于兩個勞動力成本是不一樣的,是以美國員工的工資和中國員工的工資工資計算方式是不一樣的。我們可以把計算中國員工工資和計算美國員工工資視作兩個獨立的部分。類圖如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwkzX39GZhh2csATMflHLwEzX4xSZz91ZsADMx8FdsYkRGZkRG9lcvx2bjxSa2EWNhJTW1AlUxEFeVRUUfRHelRHL2EzXlpXazxyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3PnVGcq5SN0MzN1E2N4QzMkljMkdDO3UzM0AjZhRjY1QGZkFWZ58CXyEzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.jpeg)
具體實作:
//首先聲明一個計算工資的接口
應用場景
對應Strategy模式來說,主要有這些應用場景:
1. 多個類隻差別在表現行為不同,可以用Strategy模式,在運作時動态選擇具體要執行的行為。
2.需要在不同情況下使用不同的政策,或者政策還可能在未來使用其它方式實作。
3.對客戶隐藏具體政策(算法)的實作細節,彼此完全獨立。
優點:
1. 提供了一種替代繼承的方法,而且既保持了繼承的優點(代碼重用),還比繼承更靈活,因為算法是獨立的,可以靈活擴充。
2. 避免程式中使用多重條件轉移語句,使系統更靈活,并易于擴充。
3. 遵守大部分GRASP原則和常用設計原則,高内聚,低耦合。
缺點:
1.因為每個具體政策類都會産生一個新類,是以會增加系統需要維護的類的數量。