天天看點

Java設計模式教程-政策模式(Strategy Pattern)

1 簡介

也叫做政策模式(Policy Pattern)

維基百科

對象有某個行為,但是在不同的場景中,該行為有不同的實作算法.。比如每個人都要“交個人所得稅”,但是“在美國交個人所得稅”和“在中國交個人所得稅”就有不同的算稅方法.

定義

Define a family of algorithms,encapsulate each one,and make them interchangeable.

定義一組算法,将每個算法都封裝起來,并且使它們之間可以互換。

常見 if/else 結構。

行為型。

在運作時(非編譯時)改變軟體的算法行為。

定義一個通用的問題,使用不同的算法來實作,然後将這些算法都封裝在一個統一接口。

政策模式使用的就是OOP的繼承和多态。

Java設計模式教程-政策模式(Strategy Pattern)

Context 封裝角色

即上下文角色,起承上啟下的封裝作用。屏蔽高層子產品對政策&算法的直接通路,封裝可能存在的變化。

Strategy 抽象政策角色

政策&算法家族的抽象,通常為接口,定義每個政策或算法必須具有的方法和屬性。

ConcreteStrategy 具體政策角色

實作抽象政策中的操作,含有具體的算法。

抽象政策角色

一個非常普通的接口,在項目中就是一個普通接口,定義一或多個具體算法。

2 适用場景

一個對象,其行為有些固定不變,有些又容易變化。對于這些容易變化的行為,我們不希望将其實作綁定在對象中,而希望能夠動态地針對不同場景産生不同應對的政策。

這時就要用到政策模式,就是為了應對對象中複雜多變的行為而産生的:

系統有很多類,而他們的差別僅在于行為不同

一個系統需要動态地在幾種算法中選擇一種

3 優點

符合開閉原則

避免使用多重條件轉移語句

e.g. 省去大量 if/else、switch,降低代碼耦合度

提高算法的保密性和安全性

隻需知道政策的業務功能,而不關心内部實作

4 缺點

用戶端必須知道所有的政策類,并決定使用哪個政策類

産生很多政策類

5 相關設計模式的差異

行為型

接收已經建立好的對象,進而實作不同的行為

創造型

接收指令,建立符合要求的具體對象

若系統中某類的某行為存在多種實作方式,用戶端需知道到底使用哪個政策

若系統中某對象存在多種狀态,不同狀态下的行為又具有差異,狀态之間會自動轉換,用戶端不需要關心具體狀态

6 實戰

Java設計模式教程-政策模式(Strategy Pattern)

促銷政策接口

Java設計模式教程-政策模式(Strategy Pattern)

返現政策

Java設計模式教程-政策模式(Strategy Pattern)

立減政策

Java設計模式教程-政策模式(Strategy Pattern)

滿減政策

Java設計模式教程-政策模式(Strategy Pattern)

測試類

Java設計模式教程-政策模式(Strategy Pattern)
Java設計模式教程-政策模式(Strategy Pattern)

改造後的測試類

Java設計模式教程-政策模式(Strategy Pattern)

可見 if/else 語句過多,采取政策+工廠模式結合

政策工廠

Java設計模式教程-政策模式(Strategy Pattern)

最新測試類

Java設計模式教程-政策模式(Strategy Pattern)

輸出結果

Java設計模式教程-政策模式(Strategy Pattern)

7 源碼應用解析

政策比較器

Java設計模式教程-政策模式(Strategy Pattern)
Java設計模式教程-政策模式(Strategy Pattern)

比如Arrays類中的 sort 方法通過傳入不同比較接口器的實作達到不同排序政策

Java設計模式教程-政策模式(Strategy Pattern)

類似于促銷活動中有促銷政策對象,在T reeMap 中也有比較器對象

Java設計模式教程-政策模式(Strategy Pattern)

compare 方法進步加工

Java設計模式教程-政策模式(Strategy Pattern)

不同通路政策

Java設計模式教程-政策模式(Strategy Pattern)

兩種 bean 的初始化政策