策略模式

1. 概念

定義一系列的算法滚局,把他們一個個封裝起來作郭,并且使他們可互相替換。本模式使得算法可獨立于使用它的客戶端而變化逛腿。


image.png

2. 使用場景

一個類定義了多種行為诱建,并且這些行為在這個類的方法中以多個條件語句的形式出現(xiàn)蝴蜓,那么可以使用策略模式避免在類中使用大量的條件語句。

3. 實例

interface AbstractStrategy {
    int calculatePrice(int km);
}
public class BusStrategy implements AbstractStrategy{

    @Override
    public int calculatePrice(int km) {
        int extraTotal = km - 10;
        int extraFactor = extraTotal / 5;
        int faction = extraFactor % 5;
        int price = 1 + extraFactor % 5;
        return faction > 0 ? ++price : price;
    }
}
public class SubwayStrategy implements AbstractStrategy {
    @Override
    public int calculatePrice(int km) {
        if (km <= 6) {
            return 3;
        } else if (km > 6 && km < 12) {
            return 4;
        } else if (km > 12 && km < 24) {
            return 5;
        } else if (km > 24 && km < 32) {
            return 6;
        }
        return 7;
    }
}
public class Context {
    private AbstractStrategy strategy;

    public void setStrategy(AbstractStrategy strategy) {
        this.strategy = strategy;
    }

    public int caculatePrice(int km) {
        return strategy.calculatePrice(km);
    }
}
public class Client {
    public static void main(String[] args) {
        Context calculate = new Context();
        calculate.setStrategy(new BusStrategy());
        System.out.println("公交車20km價格:" + calculate.caculatePrice(20));
    }
}

如果不用到策略模式俺猿,而是簡單地添加if判斷條件:

public class PriceCalculate {
    private static final int BUS = 1;
    private static final int SUBWAY = 2;

    public static void main(String[] args) {
        PriceCalculate priceCalculate = new PriceCalculate();
        System.out.println("做20km公交票價:" + priceCalculate.calculatePrice(11, BUS));
    }

    /**
     * 公交計價茎匠,10公里之內(nèi)1塊錢,超過10公里每5公里1塊錢
     *
     * @param km
     * @return
     */
    private int busPrice(int km) {
        int extraTotal = km - 10;
        int extraFactor = extraTotal / 5;
        int faction = extraFactor % 5;
        int price = 1 + extraFactor % 5;
        return faction > 0 ? ++price : price;
    }

    /**
     * 地鐵售價
     * @param km
     * @return
     */
    private int subwayPrice(int km) {
        if (km <= 6) {
            return 3;
        } else if (km > 6 && km < 12) {
            return 4;
        } else if (km > 12 && km < 24) {
            return 5;
        } else if (km > 24 && km < 32) {
            return 6;
        }
        return 7;
    }

    public int calculatePrice(int km, int type){
        if (type==BUS){
            return busPrice(km);
        } else if (type==SUBWAY){
            return subwayPrice(km);
        }
        return 0;
    }
}

這樣當添加新的策略時押袍,不好維護诵冒,而且耦合度比較高。

4. 特點

上下文context與具體策略是松耦合關(guān)系
策略模式滿足“開-閉原則”

5. 在android中的應用

Volley中對于HttpStack的設計

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谊惭,一起剝皮案震驚了整個濱河市汽馋,隨后出現(xiàn)的幾起案子侮东,更是在濱河造成了極大的恐慌,老刑警劉巖豹芯,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悄雅,死亡現(xiàn)場離奇詭異,居然都是意外死亡告组,警方通過查閱死者的電腦和手機煤伟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來木缝,“玉大人便锨,你說我怎么就攤上這事∥业” “怎么了放案?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長矫俺。 經(jīng)常有香客問我吱殉,道長,這世上最難降的妖魔是什么厘托? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任友雳,我火速辦了婚禮,結(jié)果婚禮上铅匹,老公的妹妹穿的比我還像新娘押赊。我一直安慰自己,他們只是感情好包斑,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布流礁。 她就那樣靜靜地躺著,像睡著了一般罗丰。 火紅的嫁衣襯著肌膚如雪神帅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天萌抵,我揣著相機與錄音找御,去河邊找鬼。 笑死绍填,一個胖子當著我的面吹牛萎坷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沐兰,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔽挠!你這毒婦竟也來了住闯?” 一聲冷哼從身側(cè)響起瓜浸,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎比原,沒想到半個月后插佛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡量窘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年雇寇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚌铜。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锨侯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冬殃,到底是詐尸還是另有隱情囚痴,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布审葬,位于F島的核電站深滚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涣觉。R本人自食惡果不足惜痴荐,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望官册。 院中可真熱鬧生兆,春花似錦、人聲如沸攀隔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昆汹。三九已至明刷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間满粗,已是汗流浹背辈末。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留映皆,地道東北人挤聘。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像捅彻,于是被迫代替她去往敵國和親组去。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

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

  • 1 場景問題# 1.1 報價管理## 向客戶報價步淹,對于銷售部門的人來講从隆,這是一個非常重大诚撵、非常復雜的問題,對不同的...
    七寸知架構(gòu)閱讀 5,080評論 9 62
  • 1 場景問題 1.1 報價管理 向客戶報價键闺,對于銷售部門的人來講寿烟,這是一個非常重大、非常復雜的問題辛燥,對不同的客戶要...
    4e70992f13e7閱讀 3,087評論 2 16
  • 版權(quán)聲明:本文為博主原創(chuàng)文章挎塌,未經(jīng)博主允許不得轉(zhuǎn)載 PS:轉(zhuǎn)載請注明出處作者: TigerChain地址: htt...
    TigerChain閱讀 1,513評論 4 12
  • 上一篇:015-CFBridgingRelease簡析 一徘六、說白了 所謂策略模式(Strategy),說白了就是:...
    AncientMing閱讀 810評論 0 1
  • 看到這個字勃蜘,我想到的是樂嘉的性格色彩學硕噩,他用“紅、藍缭贡、黃炉擅、綠”四色代表人的性格類型。 紅色性格的人是開放的和直接的...
    好聽的暖陽閱讀 189評論 0 1