HeadFirst 設(shè)計模式? --- 第一章:策略模式

讀書筆記

1. 前言

設(shè)計模式的存在,主要是方便代碼的可擴(kuò)展性和提高代碼的復(fù)用性钓株。在變化和穩(wěn)定之間尋找平衡點(diǎn)实牡。

2. 從鴨子說起

策略模式,書中是以鴨子為例轴合,進(jìn)行介紹的创坞。
假設(shè)鴨子的父類為:

Duck
quack()
swim()
display()
//鴨子的其他方法
image.png

因 為 每 一 種 鴨 子 的外 觀 都 不 同 , 所 以display()方法是抽象的,每個鴨子子類負(fù)責(zé)實(shí)現(xiàn)自己的display受葛。

3. 鴨子要飛了

現(xiàn)在需要給鴨子們摆霉,增加一個飛的動作
新的需求來了奔坟,這時候我們要加入鴨子會飛的功能携栋。鴨子本來有翅膀,沒問題咳秉,在超類里加入一個fly方法婉支,讓所有的子類繼承就好了,

Duck
quack()
swim()
display()
fly() //新加入的飛行方法
//鴨子的其他方法

確實(shí)澜建,所有的鴨子都會飛了向挖,然而系統(tǒng)里還有一些橡皮鴨子蝌以,它們也會飛了,這是不符合常理的:沃8!
我們忽略了一件事情溶推,并不是所有子類都會飛徊件,某些不會飛的也繼承了此方法。

注意:對代碼所做的局部修改蒜危,影響層面可不只是局部虱痕。
當(dāng)涉及"維護(hù)"時,為了"復(fù)用"目的而使用繼承辐赞,結(jié)局并不完美部翘。

3.1 第一個解決辦法—子類覆蓋

我們可以把橡皮鴨中的fly方法覆蓋掉

RubberDuck
quack(){//吱吱叫}
display(){//橡皮鴨}
fly(){
  //覆蓋,什么也不做
}

這樣好像確實(shí)解決了橡皮鴨的問題响委,但如果我們以后每次加入不會飛的鴨子新思,都要這樣檢查一遍,就失去了復(fù)用的意義了赘风。

3.2 第二個解決辦法---利用接口

我們可以把fly方法從超類中取出來夹囚,放進(jìn)一個Flyable接口中,這樣一來贝次,只有會飛的鴨子才實(shí)現(xiàn)此接口崔兴。
這樣會帶來很多重復(fù)代碼。


4. 重新看待問題

現(xiàn)在我們知道使用繼承并不能很好地解決問題,因?yàn)轼喿拥男袨樵谧宇惱锊粩嗟馗淖?并且讓所有的子類都有這些行為是不恰當(dāng)?shù)摹?br> Flyable與Quackable接口一開始似乎還挺不錯,解決了問題(只有會飛的鴨子才繼承Flyable),但是Java接口不具有實(shí)現(xiàn)代碼,所以繼承接口無法達(dá)到代碼的復(fù)用蛔翅。這意味著: 無論何時你需要修改某個行為,你必須得往下追蹤并在每一個定義此行為的類中修改它,一不小心,可能會造成新的錯誤!

幸運(yùn)的是,有一個設(shè)計原則,恰好適用于此狀況敲茄。

設(shè)計原則: 找出應(yīng)用中可能需要變化之處,把它們獨(dú)立出來,不要和那些不需要變化的代碼混在一起

在變化和穩(wěn)定之間尋找平衡點(diǎn)山析。
好,該是把鴨子的行為從Duck類中取出的時候了!


5. 重新設(shè)計鴨子

我們提取出兩組類堰燎,一個是fly,一個是quack笋轨,每一組類實(shí)現(xiàn)各自的動作秆剪,可以指定特定類型的飛行行為給鴨子,讓它們動態(tài)的去改變就好了爵政。

設(shè)計原則:針對接口編程仅讽,而不是針對實(shí)現(xiàn)編程。

我們利用接口代表每個行為钾挟,行為的每個實(shí)現(xiàn)都將實(shí)現(xiàn)其中的一個接口洁灵。

image.png

這么一來,有了繼承的“復(fù)用”好處,卻沒有繼承所帶來的包袱。


6. 實(shí)現(xiàn)鴨子行為

首先掺出,在Duck類中“加入兩個實(shí)例變量”徽千,分別為“flyBehavior”與“quack Behavior”苫费,聲明為接口類型(而不是具體類實(shí)現(xiàn)類型),每個鴨子對象都會動態(tài)地設(shè)置這些變量以在運(yùn)行時引用正確的行為類型(例如:FlyWithWings、Squeak等)双抽。
我們也必須將Duck類與其所有子類中的fly()與quack()刪除,因?yàn)檫@些行為已經(jīng)被搬到FlyBehavior與QuackBehavior類中了百框。
我們用兩個相似的方法performFly()和performQuack()取代Duck類中的fly()與quack()。

//父類
Duck
FlyBehavior flyBehavior
QuackBehavior quackBehavior
performQuack(){      quackBehavior.quack();    }
swim()
display()
performFly()
//某個子類
public class MallardDuck extends Duck {    
     public MallardDuck() {       
          quackBehavior = new Quack();       
          flyBehavior = new FlyWithWings();
     }    

     public void display() {  
        System.out.println(“I’m a real Mallard duck”);    
    } 
}

7. 總結(jié)

當(dāng)你將兩個類結(jié)合起來使用牍汹,如同本例一般铐维,這就是組合(composition)。這種做法和“繼承”不同的地方在于,鴨子的行為不是繼承來的柑贞,而是和適當(dāng)?shù)男袨閷ο蟆敖M合”來的方椎。

如你所見聂抢,使用組合建立系統(tǒng)具有很大的彈性钧嘶,不僅可將算法族封裝成類,更可以“在運(yùn)行時動態(tài)地改變行為”琳疏,只要組合的行為對象符合正確的接口標(biāo)準(zhǔn)即可有决。

設(shè)計原則:多用組合,少用繼承空盼。

策略模式
定義了算法族书幕,分別封裝起來,讓它們之間可以互相替換揽趾,此模式讓算法的變化獨(dú)立于使用算法的客戶贬养。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杜耙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诉字,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愉择,死亡現(xiàn)場離奇詭異粮揉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)澄者,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門笆呆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粱挡,你說我怎么就攤上這事赠幕。” “怎么了询筏?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵榕堰,是天一觀的道長。 經(jīng)常有香客問我屈留,道長局冰,這世上最難降的妖魔是什么测蘑? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮康二,結(jié)果婚禮上碳胳,老公的妹妹穿的比我還像新娘。我一直安慰自己沫勿,他們只是感情好挨约,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著产雹,像睡著了一般诫惭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔓挖,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天夕土,我揣著相機(jī)與錄音,去河邊找鬼瘟判。 笑死怨绣,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拷获。 我是一名探鬼主播篮撑,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匆瓜!你這毒婦竟也來了赢笨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤驮吱,失蹤者是張志新(化名)和其女友劉穎茧妒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體糠馆,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘶伟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了又碌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片九昧。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖毕匀,靈堂內(nèi)的尸體忽然破棺而出铸鹰,到底是詐尸還是另有隱情,我是刑警寧澤皂岔,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布蹋笼,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏剖毯。R本人自食惡果不足惜圾笨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逊谋。 院中可真熱鬧擂达,春花似錦、人聲如沸胶滋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽究恤。三九已至俭令,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間部宿,已是汗流浹背抄腔。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窟赏,地道東北人妓柜。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓箱季,卻偏偏與公主長得像涯穷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子藏雏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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

  • 本文參照《Head First 設(shè)計模式》拷况,轉(zhuǎn)載請注明出處對于整個系列,我們按照這本書的設(shè)計邏輯掘殴,使用情景分析的方...
    詭異的葉子閱讀 608評論 0 5
  • 假如我們現(xiàn)在有一個鴨子赚瘦,鴨子會呱呱叫,也會游泳奏寨,但是每個鴨子的外觀不相同(有白顏色的起意,有綠色的),那么你會怎么設(shè)計...
    巾二閱讀 305評論 1 1
  • 花了好長時間來想一個標(biāo)題,怎么能表達(dá)我的想法套菜,想寫這段文字的起因是因?yàn)榕撍赖馁徫镄睦怼? 我不知道有多少...
    WSXUWEN閱讀 384評論 0 3
  • 文/張利英 走過的路亲善,經(jīng)歷過的事像一本書一樣,偶爾翻閱逗柴,記憶游絲蛹头;時光斑駁、白駒過隙,偶爾回首歷久銘心渣蜗。 ...
    一天情感隨筆閱讀 491評論 1 1
  • 做好了晚飯屠尊,爸爸還沒有回來,我正在手機(jī)上做題目耕拷,媽媽突然從廚房走過來知染,對我說,想吃晚飯了斑胜。我說我也想控淡,但是爸爸還沒...
    楊姌閱讀 132評論 0 0