1 簡介
也叫做政策模式(Policy Pattern)
維基百科
對象有某個行為,但是在不同的場景中,該行為有不同的實作算法.。比如每個人都要“交個人所得稅”,但是“在美國交個人所得稅”和“在中國交個人所得稅”就有不同的算稅方法.
定義
Define a family of algorithms,encapsulate each one,and make them interchangeable.
定義一組算法,将每個算法都封裝起來,并且使它們之間可以互換。
常見 if/else 結構。
行為型。
在運作時(非編譯時)改變軟體的算法行為。
定義一個通用的問題,使用不同的算法來實作,然後将這些算法都封裝在一個統一接口。
政策模式使用的就是OOP的繼承和多态。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iZ1UDZmljYwQ2MkFTYmVjN2ATZklzYhRTYzMWMhRGZk9CXzIzLcZDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
Context 封裝角色
即上下文角色,起承上啟下的封裝作用。屏蔽高層子產品對政策&算法的直接通路,封裝可能存在的變化。
Strategy 抽象政策角色
政策&算法家族的抽象,通常為接口,定義每個政策或算法必須具有的方法和屬性。
ConcreteStrategy 具體政策角色
實作抽象政策中的操作,含有具體的算法。
抽象政策角色
一個非常普通的接口,在項目中就是一個普通接口,定義一或多個具體算法。
2 适用場景
一個對象,其行為有些固定不變,有些又容易變化。對于這些容易變化的行為,我們不希望将其實作綁定在對象中,而希望能夠動态地針對不同場景産生不同應對的政策。
這時就要用到政策模式,就是為了應對對象中複雜多變的行為而産生的:
系統有很多類,而他們的差別僅在于行為不同
一個系統需要動态地在幾種算法中選擇一種
3 優點
符合開閉原則
避免使用多重條件轉移語句
e.g. 省去大量 if/else、switch,降低代碼耦合度
提高算法的保密性和安全性
隻需知道政策的業務功能,而不關心内部實作
4 缺點
用戶端必須知道所有的政策類,并決定使用哪個政策類
産生很多政策類
5 相關設計模式的差異
行為型
接收已經建立好的對象,進而實作不同的行為
創造型
接收指令,建立符合要求的具體對象
若系統中某類的某行為存在多種實作方式,用戶端需知道到底使用哪個政策
若系統中某對象存在多種狀态,不同狀态下的行為又具有差異,狀态之間會自動轉換,用戶端不需要關心具體狀态
6 實戰
促銷政策接口
返現政策
立減政策
滿減政策
測試類
改造後的測試類
可見 if/else 語句過多,采取政策+工廠模式結合
政策工廠
最新測試類
輸出結果
7 源碼應用解析
政策比較器
比如Arrays類中的 sort 方法通過傳入不同比較接口器的實作達到不同排序政策
類似于促銷活動中有促銷政策對象,在T reeMap 中也有比較器對象
compare 方法進步加工
不同通路政策
兩種 bean 的初始化政策