Android 設(shè)計模式之策略模式

在日常開發(fā)過程中時常需要用到設(shè)計模式,但是設(shè)計模式有23種缸废,如何將這些設(shè)計模式了然于胸并且能在實際開發(fā)過程中應(yīng)用得得心應(yīng)手呢?和我一起跟著《Android源碼設(shè)計模式解析與實戰(zhàn)》一書邊學(xué)邊應(yīng)用吧忌警!

設(shè)計模式系列文章

今天我們要講的是策略模式


定義

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

使用場景

  • 針對同一類型問題的多種處理方式哺哼,僅僅是具體行為有差別時
  • 需要安全地封裝多種同一類型的操作時
  • 出現(xiàn)同一抽象類有多個子類,而又需要if-else或者switch-case來選擇具體的子類時

使用例子

  • Android中屬性動畫的時間差值器分為線性差值器叼风、加速減速差值器等取董,這些差值器里面就用到了策略模式來隔離不同的動畫速率計算算法

實現(xiàn)

3大角色

  • 用來操作策略的上下文環(huán)境
  • 策略的抽象
  • 具體的策略實現(xiàn)

實現(xiàn)的要點

  • 將不同策略的相同的行為抽象到抽象策略中
  • 具體的策略實現(xiàn)不同的算法
  • 上下文環(huán)境根據(jù)需要注入需要的策略,并把相應(yīng)的操作委托給注入的策略處理

實現(xiàn)方式

下面我們以計算不同交通工具的車費來簡單看看策略模式的實現(xiàn)

  • 首先抽象出計算車費的操作咬扇,因為不同的策略最后都會計算車費并返回結(jié)果
public interface CalculateStragety {

    /**
     * 根據(jù)公里數(shù)計算價格
     *
     * @param km 公里數(shù)
     * @return 價格
     */
    int calculatePrice(int km);
}
  • 然后我們分別實現(xiàn)具體的策略甲葬,比如計算公交車的車費的策略
public class BusStragety implements CalculateStragety {

    /**
     * 十公里之內(nèi)一元,超過十公里每加一元錢可以坐5公里
     * @param km 公里數(shù)
     * @return 公交車車費
     */
    @Override
    public int calculatePrice(int km) {
        //超過十公里的總距離
        int extraTotal = km - 10;

        // 超過的距離是5公里的倍數(shù)
        int extraFactor = extraTotal / 5;

        //超過的距離對5公里取余
        int fraction = extraTotal % 5;

        //價格計算
        int price = 1 + extraFactor * 1 ;

        return fraction > 0 ? ++price : price;
    }
}
  • 再加一個出租車的車費計算策略
public class TaxiStragety implements CalculateStragety {

    /**
     * 出租車車費為每公里2元
     * @param km 公里數(shù)
     * @return 出租車車費
     */
    @Override
    public int calculatePrice(int km) {
        return km * 2;
    }
}
  • 然后我們看看怎么根據(jù)需要注入不同的策略懈贺,并把具體的計算委托給注入的策略
public class TrafficCalculator {
    public static void main(String[] args) {
        TrafficCalculator trafficCalculator = new TrafficCalculator();
        trafficCalculator.setCalculateStragety(new BusStragety());
        trafficCalculator.calculatePrice(66);
    }
    
    CalculateStragety mCalculateStragety;
    
    /**
     * 根據(jù)需要注入相應(yīng)的策略
     * 
     * @param calculateStragety 注入的策略
     */
    public void setCalculateStragety(CalculateStragety calculateStragety) {
        mCalculateStragety = calculateStragety;
    }

    /**
     * 把具體的計算委托給注入的策略
     * 
     * @param km 公里數(shù)
     * @return 車費
     */
    private int calculatePrice(int km) {
       return mCalculateStragety.calculatePrice(km);
    }
}

  • 在上面的例子中我們通過在TrafficCalculator中動態(tài)注入計算公交車車費的策略來計算公交車費经窖,當(dāng)然我們也可以計算出租車費坡垫,只需要把注入的策略改為出租車車費計算策略就可以了。
  • 以上就是策略模式的簡單實現(xiàn)了画侣。

策略模式和代理模式

  • 策略模式和代理模式在應(yīng)用情景上有點相似冰悠,都是處理有多種實現(xiàn)方式或是有多種情況需要考慮的情況,而且都是通過抽象提取各個子類的共同行為配乱。但是2種模式還是有很多不同之處溉卓。
  • 首先代理模式有代理類,而策略模式?jīng)]有搬泥。
  • 代理模式把對子類的選擇封裝在了代理類中桑寨,并通過代理類對外提供服務(wù);而策略模式則是通過動態(tài)注入的方式來讓客戶端選擇需要的策略
  • 策略模式更側(cè)重于策略或是算法的封裝隔離忿檩;而代理模式更側(cè)重于通過代理類提供代理服務(wù)
  • 最后尉尾,2者都有個缺點,就是隨著策略的增加或是要考慮的情況增多燥透,子類也會變得越來越多

總結(jié)

  • 策略模式主要用來分離算法沙咏,在相同的行為抽象下有不同的具體實現(xiàn)策略。
  • 策略模式很好地展示了開閉原則班套,也就是定義抽象肢藐,注入不同的實現(xiàn),從而達(dá)到很好的擴(kuò)展性
  • 當(dāng)我們在實現(xiàn)一個功能時遇到很多if-else或是switch-case的時候就可以考慮下這里是不是可以用策略模式了

源碼地址:https://github.com/snowdream1314/DesignPatternsExamples


歡迎關(guān)注我的微信公眾號吱韭,期待與你一起學(xué)習(xí)吆豹,一起交流,一起成長杉女!


AntDream
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞻讽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子熏挎,更是在濱河造成了極大的恐慌速勇,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坎拐,死亡現(xiàn)場離奇詭異烦磁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哼勇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門都伪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人积担,你說我怎么就攤上這事陨晶。” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵先誉,是天一觀的道長湿刽。 經(jīng)常有香客問我,道長褐耳,這世上最難降的妖魔是什么诈闺? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮铃芦,結(jié)果婚禮上雅镊,老公的妹妹穿的比我還像新娘。我一直安慰自己刃滓,他們只是感情好仁烹,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咧虎,像睡著了一般晃危。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上老客,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音震叮,去河邊找鬼胧砰。 笑死,一個胖子當(dāng)著我的面吹牛苇瓣,可吹牛的內(nèi)容都是我干的尉间。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼击罪,長吁一口氣:“原來是場噩夢啊……” “哼哲嘲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起媳禁,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤眠副,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后竣稽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囱怕,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年毫别,在試婚紗的時候發(fā)現(xiàn)自己被綠了娃弓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡岛宦,死狀恐怖台丛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情砾肺,我是刑警寧澤挽霉,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布防嗡,位于F島的核電站,受9級特大地震影響炼吴,放射性物質(zhì)發(fā)生泄漏本鸣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一硅蹦、第九天 我趴在偏房一處隱蔽的房頂上張望荣德。 院中可真熱鬧,春花似錦童芹、人聲如沸涮瞻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽署咽。三九已至,卻和暖如春生音,著一層夾襖步出監(jiān)牢的瞬間宁否,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工缀遍, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留慕匠,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓域醇,卻偏偏與公主長得像台谊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子譬挚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,732評論 25 707
  • 此文章全是文字锅铅,但是不長,看上去有點枯燥减宣,還請保持耐心盐须。 策略模式,很多人會忘記的一個模式蚪腋,但是是我們平時開發(fā)中用...
    Anderson大碼渣閱讀 602評論 1 32
  • 策略模式 1.定義: 策略模式定義了一系列的算法丰歌,并將每一個算法封裝起來,而且使它們還可以相互替換屉凯。策略模式讓算法...
    TangBuzhi閱讀 210評論 0 0
  • 學(xué)習(xí)資料:http://blog.lmj.wiki/2016/11/21/design-pattern/strat...
    Jsonzhang閱讀 218評論 0 0
  • 什么是懶加載立帖? 懶加載其實就是延遲加載,按需加載悠砚,只有在需要時才加載晓勇,他是網(wǎng)站的一種優(yōu)化方案。 我們?yōu)槭裁匆褂脩?..
    jeremyYao閱讀 285評論 0 0