策略模式

定義

策略模式定義了一系列算法,并將每一個(gè)算法封裝起來所灸,而且使它們可以相互替換搞挣。策略模式讓算法獨(dú)立于使用它的客戶端獨(dú)立變化。

使用場景

當(dāng)我們處理問題時(shí)磕蛇,如果需要根據(jù)不同的條件來選擇不同的解決方案景描,最簡單的方式就是用if-else,但每增加一種方案秀撇,就要修改原來的代碼超棺,而且容易出現(xiàn)錯(cuò)誤,最終導(dǎo)致代碼臃腫呵燕、耦合性高棠绘、難維護(hù)等,同時(shí)也違背了開放封閉原則再扭,所以就需要使用策略模式來解決這樣的問題氧苍。

實(shí)現(xiàn)

比如現(xiàn)在我們要做一個(gè)圖片加載的工具,需要提供給用戶設(shè)置緩存的方法泛范。來让虐,先看第一個(gè)版本:
首先定義兩個(gè)緩存類:內(nèi)存緩存、磁盤緩存:

public class MemoryCache {
    public void cache() {
        Log.e("CacheStrategy", "MemoryCache");
    }
}

public class DiskCache {
    public void cache() {
        Log.e("CacheStrategy", "DiskCache");
    }
}

然后設(shè)置緩存的方法寫在ImageLoader類中:

public class ImageLoader {
    private MemoryCache memoryCache = new MemoryCache();
    private DiskCache diskCache = new DiskCache();

    public void setCache(int type) {
        if (type == 1) {
            memoryCache.cache();
        } else if (type == 2) {
            diskCache.cache();
        }
    }
}

看起來還是蠻簡單的罢荡,但是問題也不少赡突,每增加一種緩存策略,我們就需要修改ImageLoader類区赵,來增加對(duì)應(yīng)的緩存類對(duì)象和條件邏輯惭缰,這很明顯違背了開放封閉原則,增加了維護(hù)成本和出現(xiàn)錯(cuò)誤的概率笼才。

基于這些問題漱受,所以就有了第二個(gè)版本:
先定義一個(gè)緩存策略接口:

public interface CacheStrategy {
    void cache();
}

然后修改之前的內(nèi)存緩存類、磁盤緩存類患整,實(shí)現(xiàn)這個(gè)共工接口:

public class MemoryCache implements CacheStrategy{
    @Override
    public void cache() {
        Log.e("CacheStrategy", "MemoryCache");
    }
}

public class DiskCache implements CacheStrategy {
    @Override
    public void cache() {
        Log.e("CacheStrategy", "DiskCache");
    }
}

最后重寫ImageLoader類:

public class ImageLoader {
    public void setCache(CacheStrategy cacheStrategy) {
        if (cacheStrategy != null) {
            cacheStrategy.cache();
        }
    }
}

這樣拜效,當(dāng)需要增加新的緩存策略時(shí)就不用修改ImageLoader類了喷众,只需要通過CacheStrategy接口來擴(kuò)展新的緩存策略,而不會(huì)影響原來的業(yè)務(wù)邏輯紧憾。設(shè)置緩存時(shí)可按如下方式:

public class Client {
    public static void test(){
        ImageLoader imageLoader = new ImageLoader();
        imageLoader.setCache(new DiskCache());
    }
}

最后看一下log:


小結(jié)

可以看到策略模式主要用來分離算法到千,同一個(gè)抽象行為可以有不同的具體實(shí)現(xiàn)策略,使代碼的結(jié)構(gòu)清晰赴穗,將低了耦合憔四。符合開放封閉原則,擴(kuò)展性好般眉。當(dāng)然了赵,隨著具體策略的增多相應(yīng)的類也會(huì)增加。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甸赃,一起剝皮案震驚了整個(gè)濱河市柿汛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埠对,老刑警劉巖络断,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異项玛,居然都是意外死亡貌笨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門襟沮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锥惋,“玉大人,你說我怎么就攤上這事开伏“虻” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵硅则,是天一觀的道長淹父。 經(jīng)常有香客問我,道長怎虫,這世上最難降的妖魔是什么暑认? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮大审,結(jié)果婚禮上蘸际,老公的妹妹穿的比我還像新娘。我一直安慰自己徒扶,他們只是感情好粮彤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般导坟。 火紅的嫁衣襯著肌膚如雪屿良。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天惫周,我揣著相機(jī)與錄音尘惧,去河邊找鬼。 笑死递递,一個(gè)胖子當(dāng)著我的面吹牛喷橙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播登舞,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贰逾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了菠秒?” 一聲冷哼從身側(cè)響起疙剑,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稽煤,沒想到半個(gè)月后核芽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酵熙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驰坊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匾二。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拳芙,靈堂內(nèi)的尸體忽然破棺而出察藐,到底是詐尸還是另有隱情,我是刑警寧澤舟扎,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布分飞,位于F島的核電站,受9級(jí)特大地震影響睹限,放射性物質(zhì)發(fā)生泄漏譬猫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一羡疗、第九天 我趴在偏房一處隱蔽的房頂上張望染服。 院中可真熱鬧,春花似錦叨恨、人聲如沸柳刮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秉颗。三九已至痢毒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚕甥,已是汗流浹背闸准。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梢灭,地道東北人夷家。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像敏释,于是被迫代替她去往敵國和親库快。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 1 場景問題# 1.1 報(bào)價(jià)管理## 向客戶報(bào)價(jià)钥顽,對(duì)于銷售部門的人來講义屏,這是一個(gè)非常重大、非常復(fù)雜的問題蜂大,對(duì)不同的...
    七寸知架構(gòu)閱讀 5,080評(píng)論 9 62
  • 1 場景問題 1.1 報(bào)價(jià)管理 向客戶報(bào)價(jià)闽铐,對(duì)于銷售部門的人來講,這是一個(gè)非常重大奶浦、非常復(fù)雜的問題兄墅,對(duì)不同的客戶要...
    4e70992f13e7閱讀 3,087評(píng)論 2 16
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是策略模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 策略模式和模板方法模式的區(qū)別 優(yōu)點(diǎn)和...
    w1992wishes閱讀 860評(píng)論 1 7
  • 概念及定義 概念在完成某一功能時(shí),有時(shí)需要根據(jù)不同環(huán)境采取不同的策略或行為澳叉。將這些不同的策略或行為(稱為算法)一一...
    maxwellyue閱讀 536評(píng)論 0 0
  • 上一篇:015-CFBridgingRelease簡析 一隙咸、說白了 所謂策略模式(Strategy),說白了就是:...
    AncientMing閱讀 810評(píng)論 0 1