設(shè)計(jì)模式-策略模式(strategy pattern)

需求描述:

  1. 鴨子類(duck)
  2. 多個(gè)品種的鴨子(紅頭鴨乳蛾,綠毛鴨夯到,玩具鴨)
  3. 多種行為動(dòng)作(呱呱叫,飛翔售葡,外觀展示)

如何設(shè)計(jì)呢看杭?

普通的設(shè)計(jì)模式:

  1. duck為父類,定義了呱呱叫 飛翔 外觀展示等方法
public class Duck {
    public String guagua(){
        //呱呱叫
    }
    public String fly(){
        //飛翔
    }
    public String display(){
        //外觀展示
    }
}
  1. 多個(gè)品種的鴨子 設(shè)計(jì)為子類 繼承 duck
public class RedHeadDuck extend Duck{
    //覆寫父類的外觀方法
    public String display(){
        //我是紅頭鴨
    }
}

這么設(shè)計(jì)問題出現(xiàn)了挟伙,所有的鴨子都具有了飛翔和呱呱叫的能力楼雹,但是玩具鴨并不具有飛翔的能力

修改設(shè)計(jì):

  1. duck仍為父類
public class Duck {
    public String guagua(){
        //呱呱叫
    }
    public String display(){
        //外觀展示
    }
}
  1. 設(shè)計(jì)接口 flyBehavior
public interface FlyBehavior {
    Stirng fly();
}
public class FlyDuck extend Duck implements FlyBehavior {
    public String fly(){
        //我會(huì)飛翔
    }
}
public class ToyDuck extend Duck {
    public String display() {
        //我是一個(gè)玩具鴨
    }
}

將需要實(shí)現(xiàn)飛翔的子類實(shí)現(xiàn)接口flyBehavior
這樣只需要玩具鴨不去實(shí)現(xiàn)接口就解決了飛翔的問題

但是 問題來了 如果說飛翔又分為 借力飛翔 迎風(fēng)飛翔 等不同的飛翔方式
實(shí)現(xiàn)接口的子類需要 不同的實(shí)現(xiàn)方式模孩,代碼更多 而且不能夠復(fù)用

升級(jí)設(shè)計(jì)

  1. duck為父類
  2. 設(shè)計(jì)接口 flyBehavior
  3. 設(shè)計(jì)行為類 實(shí)現(xiàn) flyBehavior
  4. duck 中引用 行為類
public class Duck {
    private FlyBehavior flyBehavior;
    public setFlyBehavior(FlyBehavior f){
        this.flyBehavior = f;
    }
    public String fly(){
        return flyBehavior.fly();
    }
}
public class NoFly implements FlyBehavior {
    public String fly () {
        //不能飛翔
    }
}
public class CanFly implements FlyBehavior {
    public String fly () {
        //可以飛翔
    }
}
//還可以定義多種飛翔方式。贮缅。榨咐。。

這樣設(shè)計(jì)就可以很靈活的修改類

結(jié)語(yǔ):策略模式(strategy pattern)
將行為類 即易改變的東西抽取出來
多用組合 少用繼承
針對(duì)接口編程 不要針對(duì)實(shí)現(xiàn)編程
原文地址 文章參考《head first 設(shè)計(jì)模式》 未經(jīng)作者允許 請(qǐng)勿轉(zhuǎn)載谴供,謝謝 :)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末块茁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子桂肌,更是在濱河造成了極大的恐慌数焊,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崎场,死亡現(xiàn)場(chǎng)離奇詭異佩耳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谭跨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門干厚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人螃宙,你說我怎么就攤上這事蛮瞄。” “怎么了谆扎?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵挂捅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我燕酷,道長(zhǎng)籍凝,這世上最難降的妖魔是什么周瞎? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任苗缩,我火速辦了婚禮,結(jié)果婚禮上声诸,老公的妹妹穿的比我還像新娘酱讶。我一直安慰自己,他們只是感情好彼乌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布泻肯。 她就那樣靜靜地躺著,像睡著了一般慰照。 火紅的嫁衣襯著肌膚如雪灶挟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天毒租,我揣著相機(jī)與錄音稚铣,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛惕医,可吹牛的內(nèi)容都是我干的耕漱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼抬伺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼螟够!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起峡钓,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤妓笙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后椒楣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體给郊,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年捧灰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淆九。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡毛俏,死狀恐怖炭庙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煌寇,我是刑警寧澤焕蹄,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站阀溶,受9級(jí)特大地震影響腻脏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜银锻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一永品、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧击纬,春花似錦鼎姐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至肯腕,卻和暖如春献宫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背实撒。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工姊途, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帖池,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓吭净,卻偏偏與公主長(zhǎng)得像睡汹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寂殉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 注:本文中的 引用實(shí)例 皆為引用《您的設(shè)計(jì)模式》上實(shí)例 策略模式 1囚巴、什么是策略模式?第一點(diǎn):定義一系列算法第二點(diǎn)...
    Flonger閱讀 439評(píng)論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理友扰,服務(wù)發(fā)現(xiàn)彤叉,斷路器,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 設(shè)計(jì)模式 開題先說明一下村怪,設(shè)計(jì)模式告訴我們?nèi)绾谓M織類和對(duì)象以解決某種問題秽浇。讓代碼變得更加優(yōu)雅是我們責(zé)無旁貸的任務(wù) ...
    tanghuailong閱讀 455評(píng)論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法甚负,內(nèi)部類的語(yǔ)法柬焕,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法梭域,線程的語(yǔ)...
    子非魚_t_閱讀 31,639評(píng)論 18 399
  • 前言 想必大家都有走過流程斑举,流程或大或小,比如有些公司用釘釘走請(qǐng)假流程病涨,你請(qǐng)假富玷,需要填審批人,首先是你的項(xiàng)目組長(zhǎng)既穆,...
    狗蛋哥閱讀 694評(píng)論 0 5