Android使用的設計模式2——策略模式


  今天講解一下策略模式,策略模式也是很常用的設計模式,對多種算法或者數據結構選擇使用的情況下,經常會使用策略模式來管理這些算法。下面會簡單講解一下策略模式的概念和基本實現。然后結合Android里面的實際應用來說明。

 

1、策略模式概念

  定義一系列算法,把他們獨立封裝起來,並且這些算法之間可以相互替換。策略模式主要是管理一堆有共性的算法,客戶端可以根據需要,很快切換這些算法,並且保持可擴展性。

策略模式的本質:分離算法,選擇實現

 

2、策略模式實現

  下面針對策略模式說一個小型的實現例子,個人覺得學習設計模式,最好的方法是看看設計模式概念,然后先看看簡單的模式實現的例子。策略模式實現起來,主要需要3部分:抽象接口、實現算法、上下文。

//算法的接口
public interface PriceStrategy
{
    public int setPrice(int orgPrice);
}
//實現一個接口,打7折商品
public class sevenPercentStrategy implements PriceStrategy
{
  public int setPrice(int orgPrice)
    {
          System.out.println("打7折商品");
          return orgPrice*0.7;
    }

}

//實現一個接口,打5折商品
public class fivePercentStrategy implements PriceStrategy
{
  public int setPrice(int orgPrice)
    {
          System.out.println("打5折商品");
          return orgPrice*0.5;
    }

}
//實現一個上下文對象
public class DstPrice
{  
    private PriceStrategy mPriceStrategy;  
      
    public void setPriceMode(PriceStrategy priceMode)
    {  
        mPriceStrategy = priceMode;  
    }  
      
    public int ExeCalPrice(int price)
    {  
        mPriceStrategy.SetPrice(price);
    }  
}  

  上面是一個最簡單的策略模式的實現方式,按照功能分為3個部分,定義算法抽象接口,然后根據具體算法實現這些接口,最后需要定義一個上下文對象。這里的上下文對象主要用來切換算法,上下文對象里面也是針對接口編程,具體算法實現被封裝了。

 

3、策略模式的理解

  上面實現的只是一種最簡單的策略模式的框架,實際應用的時候,我們可以針對不同情況修改上下文對象和具體的算法實現。比如說,可以增加一個抽象類實現作為算法模板。抽象類里面我們可以封裝一些公共的方法。這樣實現具體的算法的時候,每個算法公共部分就被分離出來。

  策略模式的目的是把具體的算法抽離出來,把每個算法獨立出來。形成一系列有共同作用的算法組,然后這個算法組里面的算法可以根據實際情況進行相互替換。

  策略模式的中心不是如何實現這些算法,而是如何組織和調用這些算法。也就是把我們平時寫到一塊的算法解耦出來,獨立成一個模塊,增強程序的擴展性。

  策略模式里面的算法通常需要數據執行,我們可以根據實際情況把數據放在不同地方。例如可以放在上下文類里面,然后每個算法都可以使用這些數據。或者對接口封裝一個抽象類,在抽象類里面添加數據。這些可以根據實際的情況綜合考慮。設計模式里面沒有一成不變的萬能模式,每種模式都有變化版本,需要根據實際的項目進行變通。

 

4、策略模式優缺點

  定義一系列算法:策略模式的功能就是定義一系列算法,實現讓這些算法可以相互替換。所以會為這一系列算法定義公共的接口,以約束一系列算法要實現的功能。如果這一系列算法具有公共功能,可以把策略接口實現成為抽象類,把這些公共功能實現到父類里面,對於這個問題,前面講了三種處理方法,這里就不羅嗦了。

  避免多重條件語句:根據前面的示例會發現,策略模式的一系列策略算法是平等的,可以互換的,寫在一起就是通過if-else結構來組織,如果此時具體的算法實現里面又有條件語句,就構成了多重條件語句,使用策略模式能避免這樣的多重條件語句。

  更好的擴展性:在策略模式中擴展新的策略實現非常容易,只要增加新的策略實現類,然后在選擇使用策略的地方選擇使用這個新的策略實現就好了。

  客戶必須了解每種策略的不同:策略模式也有缺點,比如讓客戶端來選擇具體使用哪一個策略,這就可能會讓客戶需要了解所有的策略,還要了解各種策略的功能和不同,這樣才能做出正確的選擇,而且這樣也暴露了策略的具體實現。

  增加了對象數目:由於策略模式把每個具體的策略實現都單獨封裝成為類,如果備選的策略很多的話,那么對象的數目就會很可觀。

  只適合扁平的算法結構:策略模式的一系列算法地位是平等的,是可以相互替換的,事實上構成了一個扁平的算法結構,也就是在一個策略接口下,有多個平等的策略算法,就相當於兄弟算法。而且在運行時刻只有一個算法被使用,這就限制了算法使用的層級,使用的時候不能嵌套使用。

 

5、Android中的應用

  下面說說在Android里面的應用。在Android里面策略模式的其中一個典型應用就是Adapter,在我們平時使用的時候,一般情況下我們可能繼承BaseAdapter,然后實現不同的View返回,GetView里面實現不同的算法。外部使用的時候也可以根據不同的數據源,切換不同的Adapter。

 

參考:

《研磨設計模式》

 

 

Edited by mythou

原創博文,轉載請標明出處:http://www.cnblogs.com/mythou/p/3384841.html 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM