作者:ivm
之前介紹了 單例模式,觀察者模式。今天介紹一個(gè)能簡(jiǎn)化代碼,封裝算法的超好用模式--策略模式;
《Android 源碼設(shè)計(jì)模式 解析與實(shí)戰(zhàn)》這本書很棒哦~
今天呢,我換一種方式講解,先講一個(gè)例子,然后在具體講解策略模式
例子:需求 出行助手,給定人數(shù),出行方式,要算出具體的錢.
火車 ?1人50元
長(zhǎng)途汽車 1人60元
自駕游 ?1人75元
很簡(jiǎn)單吧,再不用策略模式情況下,擁有擴(kuò)展性的代碼:

在這個(gè)類中 既能計(jì)算火車的出行方式,自駕游的出行方式,長(zhǎng)途汽車的出行方式,它的功能不單一,而且代碼中有switch—case 或者 if —else if 之類的語句,如果出行方式增加一種,我需要增加一個(gè)計(jì)算的方法,并且在判斷語句中在加一個(gè)判斷。這種代碼,維護(hù)性差,當(dāng)你要增加一種新的方式,就要改判斷,會(huì)增加出錯(cuò)的可能。
下面我用策略模式寫一遍
計(jì)算價(jià)格是每種方式都有的,我們將它抽象成接口

把每種出行方式獨(dú)立成一個(gè)類 并繼承這個(gè)接口

最后創(chuàng)建一個(gè)計(jì)算類

通過設(shè)置策略 去分別計(jì)算價(jià)格,這種寫法沒有反鎖的判斷語句,而且更容易更新迭代。
那么正式開始介紹策略模式了
什么是策略模式
定義了一系列的算法,并將每一個(gè)算法封裝起來,而且使它們還可以相互替換。策略模式獨(dú)立于使用者而獨(dú)立變換。
策略模式的使用場(chǎng)景
1.針對(duì)同一類型問題的多種處理方式,僅僅是具體行為有差別時(shí)。
2.需要安全的封裝多種統(tǒng)一類型的操作時(shí)
3.出現(xiàn)同一抽象類有多個(gè)子類,而又需要使用if —else 或者 switch — case 來選擇具體子類時(shí)
策略模式的UML 圖

角色介紹
1.Context 用來操作策略的上下文環(huán)境
2.Stragety 策略的抽象
3.ConcreteStragetA,ConcreteStragetB 具體的策略實(shí)現(xiàn)
結(jié)語
策略模式 優(yōu)點(diǎn)就是 結(jié)構(gòu)清晰明了、使用簡(jiǎn)單直觀,耦合性相對(duì)較低、擴(kuò)展方便、封裝更徹底、數(shù)據(jù)更安全。
缺點(diǎn)是:子類很多 ?(還記的65535 對(duì)你的支配的恐懼么 ?= =)