设计模式实战-策略模式(Strategy Pattern)
0 聯(lián)系我
圖片標(biāo)題 1.Q群【Java開發(fā)技術(shù)交流】:jq.qq.com/?_wv=1027&a… 2.完整博客鏈接:www.shishusheng.com 3.知乎:www.zhihu.com/people/shi-… 4.gayhub:github.com/Wasabi12340.0 相關(guān)源碼鏈接
github.com/Wasabi1234/…
1 定義
也叫做政策模式(Policy Pattern)- 維基百科 對(duì)象有某個(gè)行為,但是在不同的場(chǎng)景中,該行為有不同的實(shí)現(xiàn)算法. 比如每個(gè)人都要“交個(gè)人所得稅”,但是“在美國(guó)交個(gè)人所得稅”和“在中國(guó)交個(gè)人所得稅”就有不同的算稅方法.
- 定義 Define a family of algorithms,encapsulate each one,and make them interchangeable. 定義一組算法,將每個(gè)算法都封裝起來(lái),并且使它們之間可以互換.
在運(yùn)行時(shí)(非編譯時(shí))改變軟件的算法行為
- 主要思想 定義一個(gè)通用的問(wèn)題,使用不同的算法來(lái)實(shí)現(xiàn),然后將這些算法都封裝在一個(gè)統(tǒng)一接口的背后.
策略模式的三個(gè)角色 ● Context 封裝角色 也叫做上下文角色,起承上啟下封裝作用; 屏蔽高層模塊對(duì)策略、算法的直接訪問(wèn),封裝可能存在的變化.
● Strategy抽象策略角色 策略、算法家族的抽象,通常為接口,定義每個(gè)策略或算法必須具有的方法和屬性
● ConcreteStrategy具體策略角色 實(shí)現(xiàn)抽象策略中的操作,含有具體的算法
通用源碼
- 抽象策略角色,它是一個(gè)非常普通的接口,在我們的項(xiàng)目中就是一個(gè)普通得不能再普通的接口了,定義一個(gè)或多個(gè)具體的算法
2 適用場(chǎng)景
針對(duì)一個(gè)對(duì)象,其行為有些是固定的不變的,有些是容易變化的,針對(duì)不同情況有不同的表現(xiàn)形式。那么對(duì)于這些容易變化的行為,我們不希望將其實(shí)現(xiàn)綁定在對(duì)象中,而是希望以動(dòng)態(tài)的形式,針對(duì)不同情況產(chǎn)生不同的應(yīng)對(duì)策略。那么這個(gè)時(shí)候就要用到策略模式了。簡(jiǎn)言之,策略模式就是為了應(yīng)對(duì)對(duì)象中復(fù)雜多變的行為而產(chǎn)生的。
- 系統(tǒng)有很多類,而他們的區(qū)別僅僅在于他們的行為不同
- 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種
3 優(yōu)點(diǎn)
- 符合開閉原則
- 避免使用多重條件轉(zhuǎn)移語(yǔ)句 比如省去大量的 if/else 和 switch 語(yǔ)句,降低代碼的耦合
- 提高算法的保密性和安全性 只需知道策略的作用,而不關(guān)心內(nèi)部實(shí)現(xiàn)
4 缺點(diǎn)
- 客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類
- 產(chǎn)生很多策略類
5 相關(guān)設(shè)計(jì)模式的差異
策略模式和工廠模式
- 行為型 接收已經(jīng)創(chuàng)建好的對(duì)象,從而實(shí)現(xiàn)不同的行為
- 創(chuàng)造型 接收指令,創(chuàng)建出符合要求的具體對(duì)象
策略模式和狀態(tài)模式
- 若系統(tǒng)中某個(gè)類的某個(gè)行為存在多種實(shí)現(xiàn)方式,客戶端需要知道到底使用哪個(gè)策略
- 若系統(tǒng)中某個(gè)對(duì)象存在多種狀態(tài),不同狀態(tài)下的行為又具有差異性,狀態(tài)之間會(huì)自動(dòng)轉(zhuǎn)換,客戶端不需要關(guān)心具體狀態(tài)
6 實(shí)戰(zhàn)
改造后的測(cè)試類 可見 if/else 語(yǔ)句過(guò)多,采取策略+工廠模式結(jié)合- 策略工廠
- 最新測(cè)試類
- 輸出結(jié)果
7 源碼應(yīng)用解析
JDK中的比較器接口
- 策略比較器 比如Arrays類中的 sort 方法通過(guò)傳入不同比較接口器的實(shí)現(xiàn)達(dá)到不同排序策略
JDK中的TreeMap
類似于促銷活動(dòng)中有促銷策略對(duì)象,在T reeMap 中也有比較器對(duì)象
compare 方法進(jìn)步加工Spring 中的Resource
不同訪問(wèn)策略
Spring 中bean 的初始化ceInstantiationStrategy
- 兩種 bean 的初始化策略
轉(zhuǎn)載于:https://juejin.im/post/5c3ed8c6e51d455221610451
總結(jié)
以上是生活随笔為你收集整理的设计模式实战-策略模式(Strategy Pattern)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode7.整数反转 JavaS
- 下一篇: asp.net开源工作流CCFlow的下