策略模式

策略模式定義:

定義了策略族,可以理解成各種算法,然后把每個(gè)策略(算法)封裝起來选侨,讓它們之間可以互換掖鱼。此模式讓算法獨(dú)立于使用他的客戶。

設(shè)計(jì)模式之禪上用了下文的故事援制,講述策略模式:

在三國(guó)演義中锨用,我最佩服諸葛亮的地方不是因?yàn)樗闯雒]而有三分天下的預(yù)測(cè),也不是他在赤壁鏖戰(zhàn)中借東風(fēng)的法術(shù)隘谣,更不是他七擒七縱孟獲的策略增拥。那是什么呢?是他“氣死周瑜寻歧,罵死王朗”的氣度和風(fēng)范掌栅!想想看,你用“氣”能把一個(gè)輪胎打爆码泛,用“氣”槍能夠把路燈打碎猾封,但是要把跟你沒有任何血緣關(guān)系的人氣死有多困難呀,更何況是周瑜這種智慧型人物噪珊!

在諸葛亮氣周瑜的過程中晌缘,有一件事情:那就是周瑜賠了夫人又折兵這件事情。事情經(jīng)過是這樣的:孫權(quán)看劉備有雄起之意痢站,殺是不能殺了磷箕,那會(huì)惹天下人唾棄,就想個(gè)招兒挫他一下阵难,那有什么辦法呢岳枷?孫權(quán)有個(gè)妹妹——孫尚香,準(zhǔn)備招劉備做女婿呜叫,然后孫權(quán)想辦法把劉備軟禁起來空繁,孫權(quán)的想法還是很單純的嘛,就是不讓你劉備回西川朱庆,然后我東吳想干啥就干啥盛泡,奪荊州,吞西川也不是不可能的娱颊。東吳的想法是好的傲诵,無奈中間多了智謀無敵的諸葛亮,他早就預(yù)測(cè)了東吳有此招數(shù)维蒙,于是在劉備去東吳招親之前掰吕,特授以伴郎趙云三個(gè)錦囊果覆,說是按天機(jī)拆開解決棘手問題颅痊。

這三個(gè)妙計(jì)分別是:找喬國(guó)老幫忙(也就是走后門了),求吳國(guó)太放行(訴苦)以及孫夫人斷后局待,對(duì)這三個(gè)妙計(jì)不熟悉的讀者可以去溫習(xí)一下《三國(guó)演義》斑响,這里就不多說了菱属。想想看,這三個(gè)計(jì)謀有什么相似之處舰罚,他們都是告訴趙云要怎么執(zhí)行纽门,也就是說這三個(gè)計(jì)謀都有一個(gè)方法是執(zhí)行,具體執(zhí)行什么內(nèi)容营罢,每個(gè)計(jì)謀當(dāng)然不同了赏陵,分析到這里,我們是不是就有這樣一個(gè)設(shè)計(jì)思路:三個(gè)妙計(jì)應(yīng)該實(shí)現(xiàn)的是同一個(gè)接口饲漾?聰明蝙搔!

類圖如下:

image.png

代碼:

策略接口

public interface IStrategy {
//每個(gè)錦囊妙計(jì)都是一個(gè)可執(zhí)行的算法
public void operate();
}

策略一

public class BackDoor implements IStrategy {
public void operate() {
System.out.println("找喬國(guó)老幫忙,讓吳國(guó)太給孫權(quán)施加壓力");
}

策略二

public class GivenGreenLight implements IStrategy {
public void operate() {
System.out.println("求吳國(guó)太開綠燈,放行考传!");
}

策略三

public class BlockEnemy implements IStrategy {
public void operate() {
  System.out.println("孫夫人斷后吃型,擋住追兵");
}

通過組合的方式把策略包裹,為使用人提供方便使用的類僚楞。在使用人使用策略時(shí)勤晚,方便動(dòng)態(tài)設(shè)定策略,并通過調(diào)用策略接口的統(tǒng)一方法觸發(fā)策略泉褐,這同時(shí)暴露了策略模式的弱點(diǎn)赐写,他要求使用者清楚每一個(gè)策略的運(yùn)用時(shí)機(jī)。在上面的故事中是有漏洞的膜赃,趙云并不知道何時(shí)應(yīng)該使用哪個(gè)策略血淌,是諸葛亮提前設(shè)定好的。

public class Context {
//構(gòu)造函數(shù)财剖,你要使用哪個(gè)妙計(jì)
private IStrategy straegy;
public Context(IStrategy strategy){
      this.straegy = strategy;
}
//使用計(jì)謀了悠夯,看我出招了
public void operate(){
        this.straegy.operate();
}
}

使用者

public class ZhaoYun {
//趙云出場(chǎng)了,他根據(jù)諸葛亮給他的交代躺坟,依次拆開妙計(jì)
public static void main(String[] args) {
Context context;
//剛剛到吳國(guó)的時(shí)候拆第一個(gè)
System.out.println("---剛剛到吳國(guó)的時(shí)候拆第一個(gè)---");
context = new Context(new BackDoor()); //拿到妙計(jì)
context.operate(); //拆開執(zhí)行
System.out.println("\n\n\n\n\n\n\n\n");
//劉備樂不思蜀了沦补,拆第二個(gè)了
System.out.println("---劉備樂不思蜀了,拆第二個(gè)了---");
context = new Context(new GivenGreenLight());
context.operate(); //執(zhí)行了第二個(gè)錦囊
System.out.println("\n\n\n\n\n\n\n\n");
//孫權(quán)的小兵追來了咪橙,咋辦夕膀?拆第三個(gè)
System.out.println("---孫權(quán)的小兵追來了,咋辦美侦?拆第三個(gè)---");
context = new Context(new BlockEnemy());
context.operate(); //孫夫人退兵
System.out.println("\n\n\n\n\n\n\n\n");
}
}

整個(gè)故事的類圖

image.png

策略模式優(yōu)點(diǎn)

  1. 可以自由切換算法
  2. 避免了多條件的判斷
  3. 擴(kuò)展性好可以定義新的算法提供給使用者

策略模式缺點(diǎn)

  1. 算法類數(shù)量增多产舞,每個(gè)算法都是一個(gè)類
  2. 算法要對(duì)外安全暴露,因?yàn)槭褂谜邅頉Q定是用哪個(gè)算法菠剩,必然要了解算法內(nèi)部做了什么易猫。
可以使用其他模式來修正這個(gè)缺陷,如工廠方法模式具壮、代理模式或享元模式准颓。(書上寫的哈蝇,還不了解實(shí)際結(jié)合)

策略模式相對(duì)簡(jiǎn)單。運(yùn)用感悟以后再更新吧攘已。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炮赦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子样勃,更是在濱河造成了極大的恐慌吠勘,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峡眶,死亡現(xiàn)場(chǎng)離奇詭異看幼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)幌陕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門诵姜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搏熄,你說我怎么就攤上這事棚唆。” “怎么了心例?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵宵凌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我止后,道長(zhǎng)瞎惫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任译株,我火速辦了婚禮瓜喇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘歉糜。我一直安慰自己乘寒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布匪补。 她就那樣靜靜地躺著伞辛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夯缺。 梳的紋絲不亂的頭發(fā)上蚤氏,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音踊兜,去河邊找鬼竿滨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姐呐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼典蝌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼曙砂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骏掀,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤鸠澈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后截驮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笑陈,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年葵袭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涵妥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坡锡,死狀恐怖蓬网,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鹉勒,我是刑警寧澤帆锋,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站禽额,受9級(jí)特大地震影響锯厢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脯倒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一实辑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧藻丢,春花似錦徙菠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至问慎,卻和暖如春萍摊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背如叼。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工冰木, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓踊沸,卻偏偏與公主長(zhǎng)得像歇终,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逼龟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • 典故 荊州被劉備所占评凝,東吳大將周瑜便一心想奪回荊州。他聽說劉備的妻子剛剛?cè)ナ老俾桑驮O(shè)計(jì)要將孫權(quán)的妹妹許配給劉備奕短,讓劉...
    迎風(fēng)布陣x閱讀 489評(píng)論 0 1
  • 劉備要到江東娶老婆了,走之前諸葛亮給趙云(伴郎)三個(gè)錦囊妙計(jì)匀钧,說是按天機(jī)拆開解決棘手問題翎碑, 嘿,還別說之斯,真是解決了...
    在冬天喜歡勝利的man閱讀 314評(píng)論 0 0
  • 要準(zhǔn)備開始看書 學(xué)習(xí)的計(jì)劃安排得差不多了日杈。時(shí)間也讓自己浪費(fèi)的差不多了。九點(diǎn)多佑刷,自己就不得不爬起來了达椰。雖然進(jìn)入狀態(tài)自...
    YKCA閱讀 189評(píng)論 0 0
  • 昨天晚上下班回到家,7:00项乒,兩個(gè)侄子也在啰劲,大的不到十歲,小的八歲多檀何。 在我們家和兒子一塊兒看電腦上的《三毛流浪記...
    曹娜2017閱讀 135評(píng)論 0 0
  • 某單位的外貿(mào)部有兩位年輕人蝇裤,一位是日語翻譯,一位是英語翻譯频鉴。兩人都是名牌大學(xué)畢業(yè)栓辜,風(fēng)華正茂,在單位領(lǐng)導(dǎo)的眼里垛孔,兩人...
    四眼看遍天下閱讀 130評(píng)論 0 0