折騰Java設(shè)計(jì)模式之策略模式

博客原文地址

簡介

在策略模式(Strategy Pattern)中度苔,一個類的行為或其算法可以在運(yùn)行時(shí)更改。這種類型的設(shè)計(jì)模式屬于行為型模式浑度。簡單理解就是一組算法寇窑,可以互換,再簡單點(diǎn)策略就是封裝算法箩张。

意圖 定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換甩骏。

主要解決 在有多種算法相似的情況下,使用 if...else 所帶來的復(fù)雜和難以維護(hù)先慷。

何時(shí)使用 一個系統(tǒng)有許多許多類饮笛,而區(qū)分它們的只是他們直接的行為。

如何解決 將這些算法封裝成一個一個的類论熙,任意地替換福青。

主要角色

  • 上下文Context,擁有一個Strategy的引用
  • 抽象策略Strategy脓诡,往往是一個接口(占大部分情況)或者抽象類无午,通常提供各種具體策略的接口
  • 具體策略,這就是重點(diǎn)了祝谚,封裝了各種具體的算法

UML

img

應(yīng)用實(shí)例

  • 諸葛亮的錦囊妙計(jì)宪迟,每一個錦囊就是一個策略;
  • 旅行的出游方式交惯,選擇騎自行車次泽、坐汽車,每一種旅行方式都是一個策略商玫;
  • JAVA AWT 中的 LayoutManager箕憾;

優(yōu)點(diǎn) 1、算法可以自由切換拳昌。 2袭异、避免使用多重條件判斷。 3炬藤、擴(kuò)展性良好御铃。

缺點(diǎn) 1、策略類會增多沈矿。 2上真、所有策略類都需要對外暴露。

使用場景

  1. 如果在一個系統(tǒng)里面有許多類羹膳,它們之間的區(qū)別僅在于它們的行為睡互,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為。
  2. 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。
  3. 如果一個對象有很多的行為就珠,如果不用恰當(dāng)?shù)哪J娇芸牵@些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)。

注意事項(xiàng): 如果一個系統(tǒng)的策略多于四個妻怎,就需要考慮使用混合模式壳炎,解決策略類膨脹的問題。

項(xiàng)目描述

跳轉(zhuǎn)到我的策略模式GitHub

1.操作行為

simple1包逼侦,主要對操作行為包裝了加減乘除方法匿辩。

@Slf4j
public class Application {

    public static void main(String[] args) {
        Context context = new Context(new AddStrategy());
        log.info("10 + 5 = {}", context.executeStrategy(10, 5));

        context.setStrategy(new SubstractStrategy());
        log.info("10 - 5 = {}", context.executeStrategy(10, 5));

        context.setStrategy(new MultiplyStrategy());
        log.info("10 * 5 = {}", context.executeStrategy(10, 5));

        context.setStrategy(new DivideStrategy());
        log.info("10 / 5 = {}", context.executeStrategy(10, 5));
    }
}

執(zhí)行結(jié)果

img

2.出現(xiàn)方式

simple2包描述,主要對出行方式的包裝榛丢,包裝了3種出行方式铲球,

執(zhí)行類

public class TravelApplication {

    public static void main(String[] args) {
        Context context = new Context(new BusStrategy());
        context.executeStrategy("老王”);

        context.setStrategy(new BicycleStrategy());
        context.executeStrategy("老張”);

        context.setStrategy(new WalkStrategy());
        context.executeStrategy("老李”);
    }
}

執(zhí)行結(jié)果

<u>
image-20181222104657926

</u>

策略上下文

@Data
public class Context {

    private Strategy strategy;

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

    /**
     * 出行
     *
     * @return
     */
    public void executeStrategy(String name) {
        strategy.travel(name);
    }

}

抽象策略

public interface Strategy {

    /**
     * 出現(xiàn)方法
     *
     * @return
     */
    void travel(String name);
}

參考

策略模式

維基里的策略模式

南鄉(xiāng)清水的實(shí)際項(xiàng)目運(yùn)用之Strategy模式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市涕滋,隨后出現(xiàn)的幾起案子睬辐,更是在濱河造成了極大的恐慌,老刑警劉巖宾肺,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溯饵,死亡現(xiàn)場離奇詭異,居然都是意外死亡锨用,警方通過查閱死者的電腦和手機(jī)丰刊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來增拥,“玉大人啄巧,你說我怎么就攤上這事≌普ぃ” “怎么了秩仆?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長猾封。 經(jīng)常有香客問我澄耍,道長,這世上最難降的妖魔是什么晌缘? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任齐莲,我火速辦了婚禮,結(jié)果婚禮上磷箕,老公的妹妹穿的比我還像新娘选酗。我一直安慰自己,他們只是感情好岳枷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布芒填。 她就那樣靜靜地躺著呜叫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪殿衰。 梳的紋絲不亂的頭發(fā)上怀偷,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音播玖,去河邊找鬼。 笑死饭于,一個胖子當(dāng)著我的面吹牛蜀踏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掰吕,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼果覆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了殖熟?” 一聲冷哼從身側(cè)響起局待,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菱属,沒想到半個月后钳榨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纽门,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年薛耻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赏陵。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡饼齿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝙搔,到底是詐尸還是另有隱情缕溉,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布吃型,位于F島的核電站证鸥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏败玉。R本人自食惡果不足惜敌土,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望运翼。 院中可真熱鬧返干,春花似錦、人聲如沸血淌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至癌淮,卻和暖如春躺坟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乳蓄。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工咪橙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虚倒。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓美侦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親魂奥。 傳聞我的和親對象是個殘疾皇子菠剩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

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

  • 下面總結(jié)設(shè)計(jì)模式中的行為型模式: 1.責(zé)任鏈模式 顧名思義,責(zé)任鏈模式(Chain of Responsibili...
    Steven1997閱讀 3,471評論 0 1
  • 設(shè)計(jì)模式匯總 一耻煤、基礎(chǔ)知識 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用具壮、多...
    MinoyJet閱讀 3,948評論 1 15
  • 設(shè)計(jì)模式基本原則 開放-封閉原則(OCP),是說軟件實(shí)體(類哈蝇、模塊棺妓、函數(shù)等等)應(yīng)該可以拓展,但是不可修改买鸽。開-閉原...
    西山薄涼閱讀 3,806評論 3 14
  • 鏈接:https://github.com/WiKi123/DesignPattern作者: WiKi123(gi...
    樹懶啊樹懶閱讀 3,537評論 0 2
  • 接下來講的這位朋友涧郊,如果你是經(jīng)常讀書的相信你一定都不陌生的⊙畚澹可能在看文章的朋友妆艘,也有看過她作品… 不錯這是,我國近...
    曲沙南風(fēng)閱讀 882評論 21 43