策略模式

策略模式定義:

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

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

在三國演義中,我最佩服諸葛亮的地方不是因?yàn)樗闯雒]而有三分天下的預(yù)測,也不是他在赤壁鏖戰(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ù)測了東吳有此招數(shù),于是在劉備去東吳招親之前,特授以伴郎趙云三個(gè)錦囊,說是按天機(jī)拆開解決棘手問題。

這三個(gè)妙計(jì)分別是:找喬國老幫忙(也就是走后門了),求吳國太放行(訴苦)以及孫夫人斷后,對(duì)這三個(gè)妙計(jì)不熟悉的讀者可以去溫習(xí)一下《三國演義》,這里就不多說了。想想看,這三個(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("找喬國老幫忙,讓吳國太給孫權(quán)施加壓力");
}

策略二

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

策略三

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 {
//趙云出場了,他根據(jù)諸葛亮給他的交代,依次拆開妙計(jì)
public static void main(String[] args) {
Context context;
//剛剛到吳國的時(shí)候拆第一個(gè)
System.out.println("---剛剛到吳國的時(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ì)簡單。運(yùn)用感悟以后再更新吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容