日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android设计模式之——策略模式

發布時間:2023/12/13 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android设计模式之——策略模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、介紹

在軟件開發中也常常遇到這樣的情況:實現某一個功能可以有多種算法或者策略,我們根據實際情況選擇不同的算法或者策略來完成該功能。例如,排序算法,可以使用插入排序、歸并排序、冒泡排序等。

針對這種情況,一種常規的方法是將多種算法寫在一個類中。例如,需要提供多種排序算法,可以將這些算法寫到一個類中,每一個方法對應一個具體的排序算法:當然,也可以將這些排序算法封裝在一個統一的方法中,通過if…else…或者case等條件判斷語句來選擇具體的算法。這兩種實現方法我們都可以稱為硬編碼。然而,當很多個算法集中在一個類中時,這個類就會變得臃腫,這個類的維護成本會變高,在維護時也更容易引發錯誤。如果我們需要增加一種新的排序算法,需要修改封裝算法類的源代碼。這就明顯違反了OCP原則和單一職責原則。

如果將這些算法或者策略抽象出來,提供一個統一的接口,不同的算法或者策略有不同的實現類,這樣在程序客戶端就可以通過注入不同的實現對象來實現算法或者策略的動態替換,這種模式的可擴展性、可維護性也就更高,也就是我們本節要說的策略模式。

簡單來說就是,通常如果一個問題有多個解決方案時,最簡單的就是利用if-else或者switch-case方式根據不同的情景選擇不同的解決方案,但是這樣耦合性太高 、代碼臃腫、難以維護等。這時就可以使用策略模式來解決。

二、定義

策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。

三、使用場景

  • 針對同一類型問題的多種處理方式,僅僅是具體行為有差別時

  • 需要安全的封裝多種同一類型的操作時

  • 出現同一抽象類有多個子類,而又需要使用if-else或者switch-case來選擇具體子類時

四、策略模式的UML類圖

UML類圖:

  • Context:用來操作策略的上下文環境。

  • Stragety:策略的抽象。

  • ConcreteStrategyA、ConcreteStrategyB:具體的策略實現。

五、簡單實現

需求:計算圖書價格,初級會員沒有折扣,中級會員打9折,高級會員打8折。如果一般寫法,應該是if-else判斷他是什么級別的會員,在計算相應的折扣。下面使用策略模式來進行實現。

抽象折扣類:

public interface MemberStrategy {/*** 計算圖書的價格* @param booksPrice 圖書的原價* @return 計算出打折后的價格*/public double calcPrice(double booksPrice); }

初級會員折扣類:

public class PrimaryMemberStrategy implements MemberStrategy{/*** 初級會員折扣*/@Overridepublic double calcPrice(double booksPrice) {System.out.println("對于初級會員的沒有折扣");return booksPrice;} }

中級會員折扣類:

public class IntermediateMemberStrategy implements MemberStrategy{/*** 中級會員折扣*/@Overridepublic double calcPrice(double booksPrice) {System.out.println("對于中級會員的折扣為10%");return booksPrice * 0.9;} }

高級會員折扣類:

public class AdvancedMemberStrategy implements MemberStrategy{/*** 高級會員折扣*/@Overridepublic double calcPrice(double booksPrice) {System.out.println("對于高級會員的折扣為20%");return booksPrice * 0.8;} }

價格類:

public class Price {//持有一個具體的策略對象private MemberStrategy strategy;/*** 構造函數,傳入一個具體的策略對象* @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) {//選擇并創建需要使用的策略對象MemberStrategy strategy1 = new AdvancedMemberStrategy();//創建環境Price price = new Price(strategy1);//計算價格double quote = price.quote(300);System.out.println("圖書的最終價格為:" + quote);}}

結果:

對于高級會員的折扣為20% 圖書的最終價格為:240.0

六、策略模式和工廠模式的區別

七、Android源碼中的策略模式實現

隨著技術的發展,工程師們已經越來越重視用戶體驗、用戶交互。因此,動畫成了很多應用中必不可少的部分,一個簡單的引導頁面也要做成動畫的效果,一個按鈕的隱藏也需要加入淡入淡出的動畫效果。動畫的實現原理就是在短時間內快速的進行畫面切換,這個切換頻率需要達到人眼感覺不出卡頓,例如標準的電影是24幀/秒。在比較流暢時,Android上的動畫能夠達到60幀/秒,人眼基本看不出間隔,所以,在我們看到這個動畫就非常流暢。

單純是動畫還不足以滿足我們的需求,在動畫執行的過程中,我們還需要一些動態效果,這有點類似于電影的慢鏡頭,有時候我們需要它慢一點,有時候需要快一點,這樣動畫也變得靈動起來。這些動態效果就是通過插值器(TimeInterpolator)實現的,我們只需要對Animation對象設置不同的插值器就可以實現不同的動態效果。

LinearInterpolator、AccelerateInterpolator、CycleInterpolator等實現Interpolator,通過getInterpolator(float input)獲取當前的時間百分比,以此來計算動畫的屬性值。

八、總結

策略模式主要用來分離算法,在相同的行為抽象下有不同的具體實現策略。這個模式很好地演示了開閉原則,也就是定義抽象,注入不同的實現,從而達到很好的可擴展性。

優點:

  • 結構清晰明了、使用簡單直觀。

  • 耦合度相對而言較低,擴展方便。

  • 操作封裝也更為徹底,數據更為安全。

缺點:

  • 隨著策略的增加,子類也會變得繁多。

總結

以上是生活随笔為你收集整理的Android设计模式之——策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。