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

Android編程設(shè)計(jì)模式之策略模式詳解

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

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

一、介紹

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

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

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

簡(jiǎn)單來(lái)說(shuō)就是,通常如果一個(gè)問(wèn)題有多個(gè)解決方案時(shí),最簡(jiǎn)單的就是利用if-else或者switch-case方式根據(jù)不同的情景選擇不同的解決方案,但是這樣耦合性太高 、代碼臃腫、難以維護(hù)等。這時(shí)就可以使用策略模式來(lái)解決。

二、定義

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

三、使用場(chǎng)景

針對(duì)同一類(lèi)型問(wèn)題的多種處理方式,僅僅是具體行為有差別時(shí)

需要安全的封裝多種同一類(lèi)型的操作時(shí)

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

四、策略模式的UML類(lèi)圖

UML類(lèi)圖:

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

Stragety:策略的抽象。

ConcreteStrategyA、ConcreteStrategyB:具體的策略實(shí)現(xiàn)。

五、簡(jiǎn)單實(shí)現(xiàn)

需求:計(jì)算圖書(shū)價(jià)格,初級(jí)會(huì)員沒(méi)有折扣,中級(jí)會(huì)員打9折,高級(jí)會(huì)員打8折。如果一般寫(xiě)法,應(yīng)該是if-else判斷他是什么級(jí)別的會(huì)員,在計(jì)算相應(yīng)的折扣。下面使用策略模式來(lái)進(jìn)行實(shí)現(xiàn)。
抽象折扣類(lèi):

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

初級(jí)會(huì)員折扣類(lèi):

public class PrimaryMemberStrategy implements MemberStrategy{
  /**
   * 初級(jí)會(huì)員折扣
   */
  @Override
  public double calcPrice(double booksPrice) {
    System.out.println("對(duì)于初級(jí)會(huì)員的沒(méi)有折扣");
    return booksPrice;
  }
}

中級(jí)會(huì)員折扣類(lèi):

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

高級(jí)會(huì)員折扣類(lèi):

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

價(jià)格類(lèi):

public class Price {
  //持有一個(gè)具體的策略對(duì)象
  private MemberStrategy strategy;
  /**
   * 構(gòu)造函數(shù),傳入一個(gè)具體的策略對(duì)象
   * @param strategy  具體的策略對(duì)象
   */
  public Price(MemberStrategy strategy){
    this.strategy = strategy;
  }
  /**
   * 計(jì)算圖書(shū)的價(jià)格
   * @param booksPrice  圖書(shū)的原價(jià)
   * @return  計(jì)算出打折后的價(jià)格
   */
  public double quote(double booksPrice){
    return this.strategy.calcPrice(booksPrice);
  }
}

客戶(hù)端:

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("圖書(shū)的最終價(jià)格為:" + quote);
  }
}

結(jié)果:

對(duì)于高級(jí)會(huì)員的折扣為20%
圖書(shū)的最終價(jià)格為:240.0

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

工廠模式 策略模式
創(chuàng)建型的設(shè)計(jì)模式 行為型的設(shè)計(jì)模式
關(guān)注對(duì)象創(chuàng)建 關(guān)注行為的選擇
黑盒子(無(wú)需知道具體的實(shí)現(xiàn)過(guò)程) 白盒子(知道具體的實(shí)現(xiàn)過(guò)程)

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

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

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

LinearInterpolator、AccelerateInterpolator、CycleInterpolator等實(shí)現(xiàn)Interpolator,通過(guò)getInterpolator(float input)獲取當(dāng)前的時(shí)間百分比,以此來(lái)計(jì)算動(dòng)畫(huà)的屬性值。

八、總結(jié)

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

優(yōu)點(diǎn):

結(jié)構(gòu)清晰明了、使用簡(jiǎn)單直觀。

耦合度相對(duì)而言較低,擴(kuò)展方便。

操作封裝也更為徹底,數(shù)據(jù)更為安全。

缺點(diǎn):

隨著策略的增加,子類(lèi)也會(huì)變得繁多。

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

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Android Activity啟動(dòng)模式全面解析

    Android Activity啟動(dòng)模式全面解析

    這篇文章主要介紹了Android Activity啟動(dòng)模式全面解析的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Android Activity之間的數(shù)據(jù)傳遞方法總結(jié)

    Android Activity之間的數(shù)據(jù)傳遞方法總結(jié)

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

    Android自定義Material進(jìn)度條效果

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

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

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

    Android RecycleView添加head配置封裝的實(shí)例

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

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

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

    Android基于ViewPager實(shí)現(xiàn)類(lèi)似微信頁(yè)面切換效果

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

    仿iPhone風(fēng)格對(duì)話(huà)框(附件包含例子/jar包/jar包源碼)

    這個(gè)對(duì)框完全繼承、仿照AlertDialog,只是實(shí)現(xiàn)了自定義效果;另外,沒(méi)有實(shí)現(xiàn)setIcon,因?yàn)閕phone中的對(duì)話(huà)框多數(shù)都沒(méi)有圖標(biāo);附件包含例子、jar包、jar包源碼
    2013-01-01
  • Android實(shí)現(xiàn)注冊(cè)界面

    Android實(shí)現(xiàn)注冊(cè)界面

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

    android實(shí)現(xiàn)通過(guò)NFC讀取卡號(hào)

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

最新評(píng)論