天天看點

Java設計模式—政策模式

1、政策模式(strategy pattern)是一種比較簡單的模式,也叫做政策模式(policypattern)。

定義如下:

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

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

政策模式的通用類圖如下所示:

Java設計模式—政策模式

政策模式的三個角色:

● context                        封裝角色

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

● strategy                      抽象政策角色

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

● concrete strategy      具體政策角色

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

政策模式即在封裝角色的構造函數中将某個具體政策傳入,然後執行這個政策。

政策模式通用源碼如下: 

政策模式的優點:

● 算法可以自由切換

     這是政策模式本身定義的,隻要實作抽象政策,它就成為政策家族的一個成員,通過封裝角色對其進行封裝,保證對外提供“可自由切換”的政策。

● 避免使用多重條件判斷

    如果沒有政策模式,我們想想看會是什麼樣子?一個政策家族有5個政策算法,一會要使用a政策,一會要使用

b政策,怎麼設計呢?使用多重的條件語句?多重條件語句不易維護,而且出錯的機率大大增強。使用政策模式後,可以由其他子產品決定采用何種政策,政策家族對外提供的通路接口就是封裝類,簡化了操作,同時避免了條件語句判斷。

● 擴充性良好

    這甚至都不用說是它的優點,因為它太明顯了。在現有的系統中增加一個政策太容易了,隻要實作接口就可以了,其他都不用修改,類似于一個可反複拆卸的插件,這大大地符合了ocp原則。

政策模式的缺點:

● 政策類數量增多    每一個政策都是一個類,複用的可能性很小,類數量增多。

● 所有的政策類都需要對外暴露

政策模式的使用場景:

● 多個類隻有在算法或行為上稍有不同的場景。

● 算法需要自由切換的場景。

● 需要屏蔽算法規則的場景。

2、政策模式的擴充—政策枚舉

政策枚舉定義如下:

● 它是一個枚舉。

● 它是一個濃縮了的政策模式的枚舉。

示例如下:

題目:輸入3個參數,進行加減法運算,參數中兩個是int型的,剩下的一個參數是string型的,隻有“+”、“-”兩個符号可以選擇,不要考慮什麼複雜的校驗,我們做的是白箱測試,輸入的就是标準的int類型和合規的string類型。

繼續閱讀