設計模式實戰-策略模式(Strategy Pattern)

0 聯繫我

設計模式實戰-策略模式(Strategy Pattern)
1.Q羣【Java開發技術交流】:https://jq.qq.com/?_wv=1027&k=5UB4P1T
2.完整博客鏈接:www.shishusheng.com
3.知乎:http://www.zhihu.com/people/shi-shu-sheng-
4.gayhub:https://github.com/Wasabi1234

0.0 相關源碼鏈接

https://github.com/Wasabi1234/design-patterns

1 定義

設計模式實戰-策略模式(Strategy Pattern)
也叫做政策模式(Policy Pattern)

  • 維基百科
    對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法.
    比如每個人都要“交個人所得稅”,但是“在美國交個人所得稅”和“在中國交個人所得稅”就有不同的算稅方法.
  • 定義
    Define a family of algorithms,encapsulate each one,and make them interchangeable.
    定義一組算法,將每個算法都封裝起來,並且使它們之間可以互換.

運行時(非編譯時)改變軟件的算法行爲

  • 主要思想
    定義一個通用的問題,使用不同的算法來實現,然後將這些算法都封裝在一個統一接口的背後.

策略模式的通用類圖
策略模式使用的就是面向對象的繼承和多態機制

策略模式的三個角色
● Context 封裝角色
也叫做上下文角色,起承上啓下封裝作用;
屏蔽高層模塊對策略、算法的直接訪問,封裝可能存在的變化.

● Strategy抽象策略角色
策略、算法家族的抽象,通常爲接口,定義每個策略或算法必須具有的方法和屬性

● ConcreteStrategy具體策略角色
實現抽象策略中的操作,含有具體的算法

通用源碼

  • 抽象策略角色,它是一個非常普通的接口,在我們的項目中就是一個普通得不能再普通的接口了,定義一個或多個具體的算法

2 適用場景

針對一個對象,其行爲有些是固定的不變的,有些是容易變化的,針對不同情況有不同的表現形式。那麼對於這些容易變化的行爲,我們不希望將其實現綁定在對象中,而是希望以動態的形式,針對不同情況產生不同的應對策略。那麼這個時候就要用到策略模式了。簡言之,策略模式就是爲了應對對象中複雜多變的行爲而產生的。

  • 系統有很多類,而他們的區別僅僅在於他們的行爲不同
  • 一個系統需要動態地在幾種算法中選擇一種

3 優點

  • 符合開閉原則
  • 避免使用多重條件轉移語句
    比如省去大量的 if/else 和 switch 語句,降低代碼的耦合
  • 提高算法的保密性和安全性
    只需知道策略的作用,而不關心內部實現

4 缺點

  • 客戶端必須知道所有的策略類,並自行決定使用哪一個策略類
  • 產生很多策略類

5 相關設計模式的差異

策略模式和工廠模式

  • 行爲型
    接收已經創建好的對象,從而實現不同的行爲
  • 創造型
    接收指令,創建出符合要求的具體對象

策略模式和狀態模式

  • 若系統中某個類的某個行爲存在多種實現方式,客戶端需要知道到底使用哪個策略
  • 若系統中某個對象存在多種狀態,不同狀態下的行爲又具有差異性,狀態之間會自動轉換,客戶端不需要關心具體狀態

6 實戰

設計模式實戰-策略模式(Strategy Pattern)

設計模式實戰-策略模式(Strategy Pattern)
設計模式實戰-策略模式(Strategy Pattern)
設計模式實戰-策略模式(Strategy Pattern)
設計模式實戰-策略模式(Strategy Pattern)
設計模式實戰-策略模式(Strategy Pattern)
image.png
改造後的測試類
設計模式實戰-策略模式(Strategy Pattern)
可見 if/else 語句過多,採取策略+工廠模式結合

  • 策略工廠
    設計模式實戰-策略模式(Strategy Pattern)
  • 最新測試類
    設計模式實戰-策略模式(Strategy Pattern)
  • 輸出結果
    設計模式實戰-策略模式(Strategy Pattern)

7 源碼應用解析

JDK中的比較器接口

  • 策略比較器
    設計模式實戰-策略模式(Strategy Pattern)
    具體策略
    比如Arrays類中的 sort 方法通過傳入不同比較接口器的實現達到不同排序策略
    設計模式實戰-策略模式(Strategy Pattern)

    JDK中的TreeMap

    類似於促銷活動中有促銷策略對象,在T reeMap 中也有比較器對象
    設計模式實戰-策略模式(Strategy Pattern)
    compare 方法進步加工
    設計模式實戰-策略模式(Strategy Pattern)

    Spring 中的Resource

    不同訪問策略
    設計模式實戰-策略模式(Strategy Pattern)

    Spring 中bean 的初始化ceInstantiationStrategy

  • 兩種 bean 的初始化策略
    設計模式實戰-策略模式(Strategy Pattern)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章