Android设计模式之——策略模式
一、介紹
在軟件開發(fā)中也常常遇到這樣的情況:實(shí)現(xiàn)某一個(gè)功能可以有多種算法或者策略,我們根據(jù)實(shí)際情況選擇不同的算法或者策略來完成該功能。例如,排序算法,可以使用插入排序、歸并排序、冒泡排序等。
針對(duì)這種情況,一種常規(guī)的方法是將多種算法寫在一個(gè)類中。例如,需要提供多種排序算法,可以將這些算法寫到一個(gè)類中,每一個(gè)方法對(duì)應(yīng)一個(gè)具體的排序算法:當(dāng)然,也可以將這些排序算法封裝在一個(gè)統(tǒng)一的方法中,通過if…else…或者case等條件判斷語句來選擇具體的算法。這兩種實(shí)現(xiàn)方法我們都可以稱為硬編碼。然而,當(dāng)很多個(gè)算法集中在一個(gè)類中時(shí),這個(gè)類就會(huì)變得臃腫,這個(gè)類的維護(hù)成本會(huì)變高,在維護(hù)時(shí)也更容易引發(fā)錯(cuò)誤。如果我們需要增加一種新的排序算法,需要修改封裝算法類的源代碼。這就明顯違反了OCP原則和單一職責(zé)原則。
如果將這些算法或者策略抽象出來,提供一個(gè)統(tǒng)一的接口,不同的算法或者策略有不同的實(shí)現(xiàn)類,這樣在程序客戶端就可以通過注入不同的實(shí)現(xiàn)對(duì)象來實(shí)現(xiàn)算法或者策略的動(dòng)態(tài)替換,這種模式的可擴(kuò)展性、可維護(hù)性也就更高,也就是我們本節(jié)要說的策略模式。
簡單來說就是,通常如果一個(gè)問題有多個(gè)解決方案時(shí),最簡單的就是利用if-else或者switch-case方式根據(jù)不同的情景選擇不同的解決方案,但是這樣耦合性太高 、代碼臃腫、難以維護(hù)等。這時(shí)就可以使用策略模式來解決。
二、定義
策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。
三、使用場景
針對(duì)同一類型問題的多種處理方式,僅僅是具體行為有差別時(shí)
需要安全的封裝多種同一類型的操作時(shí)
出現(xiàn)同一抽象類有多個(gè)子類,而又需要使用if-else或者switch-case來選擇具體子類時(shí)
四、策略模式的UML類圖
UML類圖:
Context:用來操作策略的上下文環(huán)境。
Stragety:策略的抽象。
ConcreteStrategyA、ConcreteStrategyB:具體的策略實(shí)現(xiàn)。
五、簡單實(shí)現(xiàn)
需求:計(jì)算圖書價(jià)格,初級(jí)會(huì)員沒有折扣,中級(jí)會(huì)員打9折,高級(jí)會(huì)員打8折。如果一般寫法,應(yīng)該是if-else判斷他是什么級(jí)別的會(huì)員,在計(jì)算相應(yīng)的折扣。下面使用策略模式來進(jìn)行實(shí)現(xiàn)。
抽象折扣類:
public interface MemberStrategy {/*** 計(jì)算圖書的價(jià)格* @param booksPrice 圖書的原價(jià)* @return 計(jì)算出打折后的價(jià)格*/public double calcPrice(double booksPrice); }初級(jí)會(huì)員折扣類:
public class PrimaryMemberStrategy implements MemberStrategy{/*** 初級(jí)會(huì)員折扣*/@Overridepublic double calcPrice(double booksPrice) {System.out.println("對(duì)于初級(jí)會(huì)員的沒有折扣");return booksPrice;} }中級(jí)會(huì)員折扣類:
public class IntermediateMemberStrategy implements MemberStrategy{/*** 中級(jí)會(huì)員折扣*/@Overridepublic double calcPrice(double booksPrice) {System.out.println("對(duì)于中級(jí)會(huì)員的折扣為10%");return booksPrice * 0.9;} }高級(jí)會(huì)員折扣類:
public class AdvancedMemberStrategy implements MemberStrategy{/*** 高級(jí)會(huì)員折扣*/@Overridepublic double calcPrice(double booksPrice) {System.out.println("對(duì)于高級(jí)會(huì)員的折扣為20%");return booksPrice * 0.8;} }價(jià)格類:
public class Price {//持有一個(gè)具體的策略對(duì)象private MemberStrategy strategy;/*** 構(gòu)造函數(shù),傳入一個(gè)具體的策略對(duì)象* @param strategy 具體的策略對(duì)象*/public Price(MemberStrategy strategy){this.strategy = strategy;}/*** 計(jì)算圖書的價(jià)格* @param booksPrice 圖書的原價(jià)* @return 計(jì)算出打折后的價(jià)格*/public double quote(double booksPrice){return this.strategy.calcPrice(booksPrice);} }客戶端:
public class Client {public static void main(String[] args) {//選擇并創(chuàng)建需要使用的策略對(duì)象MemberStrategy strategy1 = new AdvancedMemberStrategy();//創(chuàng)建環(huán)境Price price = new Price(strategy1);//計(jì)算價(jià)格double quote = price.quote(300);System.out.println("圖書的最終價(jià)格為:" + quote);}}結(jié)果:
對(duì)于高級(jí)會(huì)員的折扣為20% 圖書的最終價(jià)格為:240.0六、策略模式和工廠模式的區(qū)別
七、Android源碼中的策略模式實(shí)現(xiàn)
隨著技術(shù)的發(fā)展,工程師們已經(jīng)越來越重視用戶體驗(yàn)、用戶交互。因此,動(dòng)畫成了很多應(yīng)用中必不可少的部分,一個(gè)簡單的引導(dǎo)頁面也要做成動(dòng)畫的效果,一個(gè)按鈕的隱藏也需要加入淡入淡出的動(dòng)畫效果。動(dòng)畫的實(shí)現(xiàn)原理就是在短時(shí)間內(nèi)快速的進(jìn)行畫面切換,這個(gè)切換頻率需要達(dá)到人眼感覺不出卡頓,例如標(biāo)準(zhǔn)的電影是24幀/秒。在比較流暢時(shí),Android上的動(dòng)畫能夠達(dá)到60幀/秒,人眼基本看不出間隔,所以,在我們看到這個(gè)動(dòng)畫就非常流暢。
單純是動(dòng)畫還不足以滿足我們的需求,在動(dòng)畫執(zhí)行的過程中,我們還需要一些動(dòng)態(tài)效果,這有點(diǎn)類似于電影的慢鏡頭,有時(shí)候我們需要它慢一點(diǎn),有時(shí)候需要快一點(diǎn),這樣動(dòng)畫也變得靈動(dòng)起來。這些動(dòng)態(tài)效果就是通過插值器(TimeInterpolator)實(shí)現(xiàn)的,我們只需要對(duì)Animation對(duì)象設(shè)置不同的插值器就可以實(shí)現(xiàn)不同的動(dòng)態(tài)效果。
LinearInterpolator、AccelerateInterpolator、CycleInterpolator等實(shí)現(xiàn)Interpolator,通過getInterpolator(float input)獲取當(dāng)前的時(shí)間百分比,以此來計(jì)算動(dòng)畫的屬性值。
八、總結(jié)
策略模式主要用來分離算法,在相同的行為抽象下有不同的具體實(shí)現(xiàn)策略。這個(gè)模式很好地演示了開閉原則,也就是定義抽象,注入不同的實(shí)現(xiàn),從而達(dá)到很好的可擴(kuò)展性。
優(yōu)點(diǎn):
結(jié)構(gòu)清晰明了、使用簡單直觀。
耦合度相對(duì)而言較低,擴(kuò)展方便。
操作封裝也更為徹底,數(shù)據(jù)更為安全。
缺點(diǎn):
- 隨著策略的增加,子類也會(huì)變得繁多。
總結(jié)
以上是生活随笔為你收集整理的Android设计模式之——策略模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019etc哪个银行折扣多?这4家银行
- 下一篇: 民生文怡联名信用卡额度多少?批大额卡的技