Android 架構(gòu)師9 設(shè)計(jì)模式之策略模式

前言

策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來(lái),而且使它們之間可以相互替換。這些策略算法是相同行為的不同實(shí)現(xiàn)。

策略模式.png

需求

三國(guó)故事中,劉備要到江東娶孫權(quán)的妹妹孫尚香,由于這行程之中危險(xiǎn)重重,故而諸葛亮在劉備走之前給了三個(gè)錦囊妙計(jì),說(shuō)是到了關(guān)鍵時(shí)刻打開(kāi)。

策略模式

三個(gè)妙計(jì)同屬于一個(gè)類型,我們用一個(gè)接口IStrategy來(lái)表示:

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

三個(gè)實(shí)現(xiàn)類,也就是三個(gè)妙計(jì):

public class BookdoorStrategy implements IStrategy {
    @Override
    public void operate() {
        System.out.println("找喬國(guó)老幫忙,讓吳國(guó)太給孫權(quán)施加壓力...");
    }
}
public class GivenGreenLightStrategy implements IStrategy {
    @Override
    public void operate() {
        System.out.println("求吳國(guó)太開(kāi)個(gè)綠燈,放行...");
    }
}
public class BlockEnemyStrategy implements IStrategy {
    @Override
    public void operate() {
        System.out.println("孫夫人斷后,擋住追兵...");
    }
}

有了妙計(jì),那還得將這些妙計(jì)放在錦囊里:

public class Context {
    private final IStrategy strategy;

    public Context(IStrategy strategy) {
        this.strategy = strategy;
    }

    public void operate() {
        this.strategy.operate();
    }
}

客戶端Client調(diào)用:

public class Client {
    public static void main(String[] args) {
        Context context;
        System.out.println("-----剛剛到吳國(guó)的時(shí)候,拆第一個(gè)-----");
        context = new Context(new BookdoorStrategy());
        context.operate();
        System.out.println("-----劉備樂(lè)不思蜀了,拆第二個(gè)-----");
        context = new Context(new GivenGreenLightStrategy());
        context.operate();
        System.out.println("-----孫權(quán)的追兵來(lái)了,拆第三個(gè)-----");
        context = new Context(new BlockEnemyStrategy());
        context.operate();
    }
}

運(yùn)行,輸出結(jié)果為:

-----剛剛到吳國(guó)的時(shí)候,拆第一個(gè)-----
找喬國(guó)老幫忙,讓吳國(guó)太給孫權(quán)施加壓力...
-----劉備樂(lè)不思蜀了,拆第二個(gè)-----
求吳國(guó)太開(kāi)個(gè)綠燈,放行...
-----孫權(quán)的追兵來(lái)了,拆第三個(gè)-----
孫夫人斷后,擋住追兵...

策略模式在Android中的應(yīng)用

動(dòng)畫(huà)中的插值器就是采用的策略模式。

總結(jié)

使用策略模式可以避免多重條件語(yǔ)句,多重條件語(yǔ)句不易維護(hù),它把采取哪一種算法讓子類實(shí)現(xiàn)。但是使用策略模式必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。換言之,策略模式只適用于客戶端知道算法或行為的情況;另外由于策略模式把每個(gè)具體的策略實(shí)現(xiàn)都單獨(dú)封裝成類,如果策略過(guò)多的話,可能會(huì)導(dǎo)致策略類過(guò)于繁多。

喜歡本篇博客的簡(jiǎn)友們,就請(qǐng)來(lái)一波點(diǎn)贊,您的每一次關(guān)注,將成為我前進(jìn)的動(dòng)力,謝謝!作者:zhang_pan

?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 真誠(chéng)的,TNANKS。 個(gè)人Github-23種設(shè)計(jì)模式案例鏈接 創(chuàng)建型模式 工廠模式 工廠模式(Factory ...
    水清_木秀閱讀 26,611評(píng)論 11 204
  • 《三國(guó)演義》中有曰:劉備、諸葛亮趁曹操赤壁之戰(zhàn)失利,大肆擴(kuò)充地盤,先后占領(lǐng)荊州大部地區(qū),引起東吳孫權(quán)的警惕。為了限...
    YoungManSter閱讀 1,421評(píng)論 2 4
  • 參考資料:菜鳥(niǎo)教程之設(shè)計(jì)模式 設(shè)計(jì)模式概述 設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)...
    Steven1997閱讀 1,270評(píng)論 1 12
  • 凌晨?jī)扇c(diǎn),黑暗籠罩了整個(gè)夜空,霧霾穿梭在寂靜的氤氳的空氣當(dāng)中,一向深居簡(jiǎn)出,哦,錯(cuò)也,是晝伏夜出的吉吉大王,又伸...
    昕若初閱讀 710評(píng)論 0 0
  • 畫(huà)得不是特別像,總覺(jué)得什么地方別扭。好長(zhǎng)一段時(shí)間不畫(huà),手都生了,形都畫(huà)不準(zhǔn)了,哎!
    西湖涵碧閱讀 199評(píng)論 0 1

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