設(shè)計模式之:策略模式

1、什么是策略模式

定義:定義了算法族,分別分裝起來,讓他們可以相互替換,此模式讓算法的變化獨(dú)立于使用算法的用戶;

2、案例

業(yè)務(wù)場景:實(shí)現(xiàn)一個描述人情緒的的應(yīng)用,該應(yīng)用可表示不同人在快樂、悲傷下做出的行為反應(yīng);

2.1、首先我們用常規(guī)的方法實(shí)現(xiàn)此需求:

(1)實(shí)現(xiàn)心情的工具類


(2)測試工具類


(3)結(jié)果:


上面的代碼的確實(shí)現(xiàn)了我們需要的功能,但我們其實(shí)可以發(fā)現(xiàn)上面的方式有很多不足之處:

(1)這種方式屬于硬編碼;

(2)此方式如果需要添加、修改新的行為需要修改工具類的代碼,使用的人越多修改的可;能就越多,代碼量就會變得非常龐大、代碼就變得難以維護(hù);

(3)如果此工具類是第三方打包提供的,那么使用的人就沒辦法進(jìn)行擴(kuò)展;

設(shè)計原則:對修改關(guān)閉,對擴(kuò)展開放。

2.2、下面我們使用策略模式實(shí)現(xiàn)上面的功能;

(1)首先我們用一個Person對象描述所有人,因?yàn)橹灰侨司投紩锌鞓泛蛡牡那榫w所以我們在Person對象里提供快樂和傷心的兩個方法;

(2)好,現(xiàn)在我們已經(jīng)把相同的部分封裝起來了,下面我們開始找到不同的或者說是未來可能發(fā)生變化的部分;雖然每個人都有開心、難過的心情,但是每個人開心、難過的時候表現(xiàn)的行為是不一樣的,甚至同一個人在不同時間場景下同一種情緒表現(xiàn)出來的行為都會不一樣,我們根本沒辦法把所有人的不同心情的行為都能預(yù)知到,所以這一部分是屬于未來可能會變化的,那我們需要把會變化部分抽離出來進(jìn)行封裝、把不同類型的行為封裝成一個算法族,讓它們不僅能夠根據(jù)場景自由切換算法策略還能在原有的策略上進(jìn)行動態(tài)擴(kuò)展;

定義開心算法族:


定義傷心的算法族:


然后我們添加開心和傷心的各種算法;







然后在我們的Person對象里面加上兩個策略并且可以動態(tài)設(shè)置兩個策略的行為;


最后我們測試一下不同的人在不同心情下的行為反應(yīng):


結(jié)果:


總結(jié):策略模式比較之前普通方式的區(qū)別

(1)策略模式可以在不修改源代碼的情況下進(jìn)行擴(kuò)展,只需要實(shí)現(xiàn)對應(yīng)的策略接口即可。

(2)最后使用什么策略最終是由使用人來決定,不受定義方的約束。

3、java api中哪些地方使用了此模式

Comparable 接口的compareTo比較策略 ?:http://blog.csdn.net/scliu12345/article/details/60333285

4、補(bǔ)充相關(guān)設(shè)計原則

(1)把應(yīng)用中可能變化的部分抽取出來、不要和系統(tǒng)不變的部分混在一起。

(2)針對接口編程而不是針對試下編程。

(3)多用組合少用繼承。

(4)對擴(kuò)展開發(fā)、對修改關(guān)閉。

http://www.itdecent.cn/p/cda324a76160

n2W?$??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容