欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android編程設計模式之策略模式詳解

 更新時間:2017年12月23日 11:06:57   作者:蹲街式等待  
這篇文章主要介紹了Android編程設計模式之策略模式,結合實例形式詳細分析了Android策略模式的概念、原理、實現(xiàn)方法及相關注意事項,需要的朋友可以參考下

本文實例講述了Android編程設計模式之策略模式。分享給大家供大家參考,具體如下:

一、介紹

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

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

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

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

二、定義

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

三、使用場景

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

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

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

四、策略模式的UML類圖

UML類圖:

Context:用來操作策略的上下文環(huán)境。

Stragety:策略的抽象。

ConcreteStrategyAConcreteStrategyB:具體的策略實現(xiàn)。

五、簡單實現(xiàn)

需求:計算圖書價格,初級會員沒有折扣,中級會員打9折,高級會員打8折。如果一般寫法,應該是if-else判斷他是什么級別的會員,在計算相應的折扣。下面使用策略模式來進行實現(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;
  /**
   * 構造函數,傳入一個具體的策略對象
   * @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);
  }
}

結果:

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

六、策略模式和工廠模式的區(qū)別

工廠模式 策略模式
創(chuàng)建型的設計模式 行為型的設計模式
關注對象創(chuàng)建 關注行為的選擇
黑盒子(無需知道具體的實現(xiàn)過程) 白盒子(知道具體的實現(xiàn)過程)

七、Android源碼中的策略模式實現(xiàn)

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

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

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

八、總結

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

優(yōu)點:

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

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

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

缺點:

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

更多關于Android相關內容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進階教程》、《Android調試技巧與常見問題解決方法匯總》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控件用法總結

希望本文所述對大家Android程序設計有所幫助。

相關文章

  • Android Activity啟動模式全面解析

    Android Activity啟動模式全面解析

    這篇文章主要介紹了Android Activity啟動模式全面解析的相關資料,需要的朋友可以參考下
    2016-02-02
  • Android Activity之間的數據傳遞方法總結

    Android Activity之間的數據傳遞方法總結

    這篇文章主要給大家總結介紹了關于Android Activity之間的數據傳遞方法,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06
  • Android自定義Material進度條效果

    Android自定義Material進度條效果

    這篇文章主要為大家詳細介紹了Android自定義Material進度條效果的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android自定義View實現(xiàn)柱狀波形圖的繪制

    Android自定義View實現(xiàn)柱狀波形圖的繪制

    柱狀波形圖是一種常見的圖形。一個個柱子按順序排列,構成一個波形圖。本文將利用Android自定義View實現(xiàn)柱狀波形圖的繪制,需要的可以參考一下
    2022-08-08
  • Android RecycleView添加head配置封裝的實例

    Android RecycleView添加head配置封裝的實例

    這篇文章主要介紹了Android RecycleView添加head配置封裝的實例的相關資料,這里提供實例幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • Android表格自定義控件使用詳解

    Android表格自定義控件使用詳解

    這篇文章主要為大家詳細介紹了Android表格自定義控件的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android基于ViewPager實現(xiàn)類似微信頁面切換效果

    Android基于ViewPager實現(xiàn)類似微信頁面切換效果

    這篇文章主要介紹了Android基于ViewPager實現(xiàn)類似微信頁面切換效果,通過Fragment適配器實現(xiàn)頁面切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 仿iPhone風格對話框(附件包含例子/jar包/jar包源碼)

    仿iPhone風格對話框(附件包含例子/jar包/jar包源碼)

    這個對框完全繼承、仿照AlertDialog,只是實現(xiàn)了自定義效果;另外,沒有實現(xiàn)setIcon,因為iphone中的對話框多數都沒有圖標;附件包含例子、jar包、jar包源碼
    2013-01-01
  • Android實現(xiàn)注冊界面

    Android實現(xiàn)注冊界面

    這篇文章主要為大家詳細介紹了Android實現(xiàn)注冊界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • android實現(xiàn)通過NFC讀取卡號

    android實現(xiàn)通過NFC讀取卡號

    這篇文章主要介紹了android實現(xiàn)通過NFC讀取卡號,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論