設(shè)計(jì)模式(一)之 策略模式

一玄柠、定義

策略模式:官方一點(diǎn)的定義就是定義好一組算法簇,將每個算法(變化)都封裝成一個類敏弃,并且使他們可以互相替換。

直白一點(diǎn)就是定義好一些會變化的行為接口蹬癌,然后將他們的不同實(shí)現(xiàn)封裝成類权她,最后 set 進(jìn)使用這些行為的客戶里面,讓客戶可以變換使用這些功能逝薪。

策略模式

二、使用場景

  • 多個子類只有在算法或行為上稍有不同蝴罪,不需要將子類和特定的行為捆綁在一起董济,還能自由切換算法的場景。
  • 需要屏蔽算法規(guī)則的場景要门。
  • Android 中虏肾,設(shè)計(jì)圖片加載框架的時候廓啊,可以預(yù)先實(shí)現(xiàn)好若干種加載策略,使用策略模式來選擇加載策略封豪。

三谴轮、栗子

策略的抽象及其實(shí)現(xiàn):

/**
 * 抽象策略角色
 * 通常為接口,定義每個策略或算法必須具有的方法和屬性吹埠。
 */
public interface Strategy {
    void doMyStrategy();
}

/**
 * 具體策略角色
 * 實(shí)現(xiàn)抽象策略中的操作第步,該類含有具體的算法。
 */
public class ConcreteStrategy1 implements Strategy{

    @Override
    public void doMyStrategy() {
        System.out.println("策略一算法");
    }

}

public class ConcreteStrategy2 implements Strategy{

    @Override
    public void doMyStrategy() {
        System.out.println("策略二算法");
    }

}

上下文角色:

/**
 * Context封裝角色:它也叫做上下文角色
 * 起承上啟下封裝作用缘琅,屏蔽高層模塊對策略粘都、算法的直接訪問,封裝可能存在的變化刷袍。
 */
public class Context {

    private Strategy strategy;
    
    public Context(Strategy s) {
        this.strategy = s;
    }
    
    public void setStrategy(Strategy s) {
        this.strategy = s;
    }
    
    public void doThings() {
        strategy.doMyStrategy();
    }
}

場景類:

public class Client {
    
    public static void main(String[] args) {
        Strategy s1 = new ConcreteStrategy1();
        Strategy s2 = new ConcreteStrategy2();
        
        //執(zhí)行策略一算法
        Context context = new Context(s1);
        context.doThings();
        
        //替換算法
        context.setStrategy(s2);
        context.doThings();
    }
}

結(jié)果:

策略一算法
策略二算法

四翩隧、策略模式優(yōu)點(diǎn)

  • 封裝性好,使用簡單呻纹。
  • 將抽出來變化的部分封裝成接口實(shí)現(xiàn)類堆生,算法可以自由切換,避免多重條件判斷雷酪。
  • 擴(kuò)展性良好顽频。擴(kuò)展只需要增加策略的具體實(shí)現(xiàn)類,替換策略太闺。符合開閉原則糯景。

五、策略模式缺點(diǎn)

  • 隨著策略的增加省骂,策略類數(shù)量增多蟀淮。
  • 所有的策略類都需要對外暴露,與迪米特原則相違背钞澳。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怠惶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子轧粟,更是在濱河造成了極大的恐慌策治,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兰吟,死亡現(xiàn)場離奇詭異通惫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)混蔼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門履腋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事遵湖』谡” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵延旧,是天一觀的道長谋国。 經(jīng)常有香客問我,道長迁沫,這世上最難降的妖魔是什么芦瘾? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮弯洗,結(jié)果婚禮上旅急,老公的妹妹穿的比我還像新娘。我一直安慰自己牡整,他們只是感情好藐吮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逃贝,像睡著了一般谣辞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沐扳,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天泥从,我揣著相機(jī)與錄音,去河邊找鬼沪摄。 笑死躯嫉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杨拐。 我是一名探鬼主播祈餐,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哄陶!你這毒婦竟也來了帆阳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤屋吨,失蹤者是張志新(化名)和其女友劉穎蜒谤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體至扰,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳍徽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了渊胸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旬盯。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖翎猛,靈堂內(nèi)的尸體忽然破棺而出胖翰,到底是詐尸還是另有隱情,我是刑警寧澤切厘,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布萨咳,位于F島的核電站,受9級特大地震影響疫稿,放射性物質(zhì)發(fā)生泄漏培他。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一遗座、第九天 我趴在偏房一處隱蔽的房頂上張望舀凛。 院中可真熱鬧,春花似錦途蒋、人聲如沸猛遍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懊烤。三九已至,卻和暖如春宽堆,著一層夾襖步出監(jiān)牢的瞬間腌紧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工畜隶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壁肋,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓籽慢,卻偏偏與公主長得像浸遗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嗡综,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評論 25 707
  • 1乙帮、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,979評論 3 119
  • 下午放學(xué)剛看到我,瀅媛就問我:"你猜我考了多少分"极景。還沒等我說話察净,就炫耀的說我考了100分∨握粒回家的路上氢卡,我們把...
    zzh13閱讀 217評論 0 0
  • “從動物到上帝” 是這本書的副標(biāo)題 斷斷續(xù)續(xù),這本書也花了2個月左右的時間看完 早在聽羅振宇晨缴,羅老師的音頻的時候有...
    低語小邵閱讀 331評論 0 0