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?$??