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