Android使用的设计模式2——策略模式
今天講解一下策略模式,策略模式也是很常用的設(shè)計(jì)模式,對(duì)多種算法或者數(shù)據(jù)結(jié)構(gòu)選擇使用的情況下,經(jīng)常會(huì)使用策略模式來管理這些算法。下面會(huì)簡單講解一下策略模式的概念和基本實(shí)現(xiàn)。然后結(jié)合Android里面的實(shí)際應(yīng)用來說明。
?
1、策略模式概念
定義一系列算法,把他們獨(dú)立封裝起來,并且這些算法之間可以相互替換。策略模式主要是管理一堆有共性的算法,客戶端可以根據(jù)需要,很快切換這些算法,并且保持可擴(kuò)展性。
策略模式的本質(zhì):分離算法,選擇實(shí)現(xiàn)。
?
2、策略模式實(shí)現(xiàn)
下面針對(duì)策略模式說一個(gè)小型的實(shí)現(xiàn)例子,個(gè)人覺得學(xué)習(xí)設(shè)計(jì)模式,最好的方法是看看設(shè)計(jì)模式概念,然后先看看簡單的模式實(shí)現(xiàn)的例子。策略模式實(shí)現(xiàn)起來,主要需要3部分:抽象接口、實(shí)現(xiàn)算法、上下文。
//算法的接口 public interface PriceStrategy {public int setPrice(int orgPrice); } //實(shí)現(xiàn)一個(gè)接口,打7折商品 public class sevenPercentStrategy implements PriceStrategy {public int setPrice(int orgPrice){System.out.println("打7折商品");return orgPrice*0.7;}}//實(shí)現(xiàn)一個(gè)接口,打5折商品 public class fivePercentStrategy implements PriceStrategy {public int setPrice(int orgPrice){System.out.println("打5折商品");return orgPrice*0.5;}} //實(shí)現(xiàn)一個(gè)上下文對(duì)象 public class DstPrice { private PriceStrategy mPriceStrategy; public void setPriceMode(PriceStrategy priceMode){ mPriceStrategy = priceMode; } public int ExeCalPrice(int price){ mPriceStrategy.SetPrice(price);} }
上面是一個(gè)最簡單的策略模式的實(shí)現(xiàn)方式,按照功能分為3個(gè)部分,定義算法抽象接口,然后根據(jù)具體算法實(shí)現(xiàn)這些接口,最后需要定義一個(gè)上下文對(duì)象。這里的上下文對(duì)象主要用來切換算法,上下文對(duì)象里面也是針對(duì)接口編程,具體算法實(shí)現(xiàn)被封裝了。
?
3、策略模式的理解
上面實(shí)現(xiàn)的只是一種最簡單的策略模式的框架,實(shí)際應(yīng)用的時(shí)候,我們可以針對(duì)不同情況修改上下文對(duì)象和具體的算法實(shí)現(xiàn)。比如說,可以增加一個(gè)抽象類實(shí)現(xiàn)作為算法模板。抽象類里面我們可以封裝一些公共的方法。這樣實(shí)現(xiàn)具體的算法的時(shí)候,每個(gè)算法公共部分就被分離出來。
策略模式的目的是把具體的算法抽離出來,把每個(gè)算法獨(dú)立出來。形成一系列有共同作用的算法組,然后這個(gè)算法組里面的算法可以根據(jù)實(shí)際情況進(jìn)行相互替換。
策略模式的中心不是如何實(shí)現(xiàn)這些算法,而是如何組織和調(diào)用這些算法。也就是把我們平時(shí)寫到一塊的算法解耦出來,獨(dú)立成一個(gè)模塊,增強(qiáng)程序的擴(kuò)展性。
策略模式里面的算法通常需要數(shù)據(jù)執(zhí)行,我們可以根據(jù)實(shí)際情況把數(shù)據(jù)放在不同地方。例如可以放在上下文類里面,然后每個(gè)算法都可以使用這些數(shù)據(jù)?;蛘邔?duì)接口封裝一個(gè)抽象類,在抽象類里面添加數(shù)據(jù)。這些可以根據(jù)實(shí)際的情況綜合考慮。設(shè)計(jì)模式里面沒有一成不變的萬能模式,每種模式都有變化版本,需要根據(jù)實(shí)際的項(xiàng)目進(jìn)行變通。
?
4、策略模式優(yōu)缺點(diǎn)
定義一系列算法:策略模式的功能就是定義一系列算法,實(shí)現(xiàn)讓這些算法可以相互替換。所以會(huì)為這一系列算法定義公共的接口,以約束一系列算法要實(shí)現(xiàn)的功能。如果這一系列算法具有公共功能,可以把策略接口實(shí)現(xiàn)成為抽象類,把這些公共功能實(shí)現(xiàn)到父類里面,對(duì)于這個(gè)問題,前面講了三種處理方法,這里就不羅嗦了。
避免多重條件語句:根據(jù)前面的示例會(huì)發(fā)現(xiàn),策略模式的一系列策略算法是平等的,可以互換的,寫在一起就是通過if-else結(jié)構(gòu)來組織,如果此時(shí)具體的算法實(shí)現(xiàn)里面又有條件語句,就構(gòu)成了多重條件語句,使用策略模式能避免這樣的多重條件語句。
更好的擴(kuò)展性:在策略模式中擴(kuò)展新的策略實(shí)現(xiàn)非常容易,只要增加新的策略實(shí)現(xiàn)類,然后在選擇使用策略的地方選擇使用這個(gè)新的策略實(shí)現(xiàn)就好了。
客戶必須了解每種策略的不同:策略模式也有缺點(diǎn),比如讓客戶端來選擇具體使用哪一個(gè)策略,這就可能會(huì)讓客戶需要了解所有的策略,還要了解各種策略的功能和不同,這樣才能做出正確的選擇,而且這樣也暴露了策略的具體實(shí)現(xiàn)。
增加了對(duì)象數(shù)目:由于策略模式把每個(gè)具體的策略實(shí)現(xiàn)都單獨(dú)封裝成為類,如果備選的策略很多的話,那么對(duì)象的數(shù)目就會(huì)很可觀。
只適合扁平的算法結(jié)構(gòu):策略模式的一系列算法地位是平等的,是可以相互替換的,事實(shí)上構(gòu)成了一個(gè)扁平的算法結(jié)構(gòu),也就是在一個(gè)策略接口下,有多個(gè)平等的策略算法,就相當(dāng)于兄弟算法。而且在運(yùn)行時(shí)刻只有一個(gè)算法被使用,這就限制了算法使用的層級(jí),使用的時(shí)候不能嵌套使用。
?
5、Android中的應(yīng)用
下面說說在Android里面的應(yīng)用。在Android里面策略模式的其中一個(gè)典型應(yīng)用就是Adapter,在我們平時(shí)使用的時(shí)候,一般情況下我們可能繼承BaseAdapter,然后實(shí)現(xiàn)不同的View返回,GetView里面實(shí)現(xiàn)不同的算法。外部使用的時(shí)候也可以根據(jù)不同的數(shù)據(jù)源,切換不同的Adapter。
?
參考:
《研磨設(shè)計(jì)模式》
?
?
Edited by mythou
原創(chuàng)博文,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://www.cnblogs.com/mythou/p/3384841.html?
轉(zhuǎn)載于:https://www.cnblogs.com/wodehao0808/p/3386107.html
總結(jié)
以上是生活随笔為你收集整理的Android使用的设计模式2——策略模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 波那契数列算法分析
- 下一篇: C++语言 对话框程序设计
