今天講解一下策略模式,策略模式也是很經常使用的設計模式,對多種算法或者數據結構選擇使用的狀況下,常常會使用策略模式來管理這些算法。下面會簡單講解一下策略模式的概念和基本實現。而後結合Android裏面的實際應用來講明。html
一、策略模式概念算法
定義一系列算法,把他們獨立封裝起來,而且這些算法之間能夠相互替換。策略模式主要是管理一堆有共性的算法,客戶端能夠根據須要,很快切換這些算法,而且保持可擴展性。編程
策略模式的本質:分離算法,選擇實現。設計模式
二、策略模式實現數據結構
下面針對策略模式說一個小型的實現例子,我的以爲學習設計模式,最好的方法是看看設計模式概念,而後先看看簡單的模式實現的例子。策略模式實現起來,主要須要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個部分,定義算法抽象接口,而後根據具體算法實現這些接口,最後須要定義一個上下文對象。這裏的上下文對象主要用來切換算法,上下文對象裏面也是針對接口編程,具體算法實現被封裝了。學習
三、策略模式的理解spa
上面實現的只是一種最簡單的策略模式的框架,實際應用的時候,咱們能夠針對不一樣狀況修改上下文對象和具體的算法實現。好比說,能夠增長一個抽象類實現做爲算法模板。抽象類裏面咱們能夠封裝一些公共的方法。這樣實現具體的算法的時候,每一個算法公共部分就被分離出來。設計
策略模式的目的是把具體的算法抽離出來,把每一個算法獨立出來。造成一系列有共同做用的算法組,而後這個算法組裏面的算法能夠根據實際狀況進行相互替換。code
策略模式的中心不是如何實現這些算法,而是如何組織和調用這些算法。也就是把咱們平時寫到一塊的算法解耦出來,獨立成一個模塊,加強程序的擴展性。
策略模式裏面的算法一般須要數據執行,咱們能夠根據實際狀況把數據放在不一樣地方。例如能夠放在上下文類裏面,而後每一個算法均可以使用這些數據。或者對接口封裝一個抽象類,在抽象類裏面添加數據。這些能夠根據實際的狀況綜合考慮。設計模式裏面沒有一成不變的萬能模式,每種模式都有變化版本,須要根據實際的項目進行變通。
四、策略模式優缺點
定義一系列算法:策略模式的功能就是定義一系列算法,實現讓這些算法能夠相互替換。因此會爲這一系列算法定義公共的接口,以約束一系列算法要實現的功能。若是這一系列算法具備公共功能,能夠把策略接口實現成爲抽象類,把這些公共功能實現到父類裏面,對於這個問題,前面講了三種處理方法,這裏就不羅嗦了。
避免多重條件語句:根據前面的示例會發現,策略模式的一系列策略算法是平等的,能夠互換的,寫在一塊兒就是經過if-else結構來組織,若是此時具體的算法實現裏面又有條件語句,就構成了多重條件語句,使用策略模式能避免這樣的多重條件語句。
更好的擴展性:在策略模式中擴展新的策略實現很是容易,只要增長新的策略實現類,而後在選擇使用策略的地方選擇使用這個新的策略實現就行了。
客戶必須瞭解每種策略的不一樣:策略模式也有缺點,好比讓客戶端來選擇具體使用哪個策略,這就可能會讓客戶須要瞭解全部的策略,還要了解各類策略的功能和不一樣,這樣才能作出正確的選擇,並且這樣也暴露了策略的具體實現。
增長了對象數目:因爲策略模式把每一個具體的策略實現都單獨封裝成爲類,若是備選的策略不少的話,那麼對象的數目就會很可觀。
只適合扁平的算法結構:策略模式的一系列算法地位是平等的,是能夠相互替換的,事實上構成了一個扁平的算法結構,也就是在一個策略接口下,有多個平等的策略算法,就至關於兄弟算法。並且在運行時刻只有一個算法被使用,這就限制了算法使用的層級,使用的時候不能嵌套使用。
五、Android中的應用
下面說說在Android裏面的應用。在Android裏面策略模式的其中一個典型應用就是Adapter,在咱們平時使用的時候,通常狀況下咱們可能繼承BaseAdapter,而後實現不一樣的View返回,GetView裏面實現不一樣的算法。外部使用的時候也能夠根據不一樣的數據源,切換不一樣的Adapter。
參考:
《研磨設計模式》
Edited by mythou
原創博文,轉載請標明出處:http://www.cnblogs.com/mythou/p/3384841.html