學(xué)習(xí)建議
在閱讀本書(shū)前,首先,需要具備Java語(yǔ)言或其他面向?qū)ο笳Z(yǔ)言的編程基礎(chǔ)。為了降低閱讀門(mén)檻,書(shū)中代碼盡可能使用最基本的語(yǔ)法,對(duì)編程水平的要求并不高。其次,需要了解面向?qū)ο蟮奶匦苑庋b、繼承、多態(tài)。書(shū)中有大量的程序結(jié)構(gòu)圖,只要具備基礎(chǔ)的UML知識(shí),便可以讀懂。
我建議,設(shè)計(jì)模式的初學(xué)者先閱讀本書(shū)的前兩章,在對(duì)設(shè)計(jì)模式有了一定程度的認(rèn)知,并了解設(shè)計(jì)原則后,再開(kāi)始學(xué)習(xí)各種設(shè)計(jì)模式。若在學(xué)習(xí)之初難以完全理解設(shè)計(jì)原則也不必?fù)?dān)心,在后面的章節(jié)中,我會(huì)結(jié)合設(shè)計(jì)模式多次講到常見(jiàn)的設(shè)計(jì)原則。書(shū)中對(duì)每種設(shè)計(jì)模式的講解獨(dú)立成章,讀者既可以按順序閱讀,也可以按照自己的需要選擇閱讀。
本書(shū)從生活中常見(jiàn)的例子切入,展開(kāi)對(duì)每種設(shè)計(jì)模式的講解。讀者可以跟隨這些例子拓展思維,思考這樣設(shè)計(jì)帶來(lái)了什么收益、涉及哪些主體、主體間如何配合、各自的職責(zé)是什么。設(shè)計(jì)模式是一種思想,學(xué)習(xí)設(shè)計(jì)模式重在悟透設(shè)計(jì)思想,而不是急于用代碼實(shí)現(xiàn)。
書(shū)中有大量的示例代碼,建議讀者在閱讀的同時(shí)動(dòng)手實(shí)踐,以便加深記憶和理解。在工作中,如果想使用某種設(shè)計(jì)模式,可以參考這些代碼,但真實(shí)的場(chǎng)景遠(yuǎn)比書(shū)中的例子復(fù)雜得多。讀者可以先從形式上開(kāi)始模仿,當(dāng)能夠靈活運(yùn)用設(shè)計(jì)思想解決問(wèn)題時(shí),形式反而沒(méi)那么重要了。大膽應(yīng)用,是真正掌握設(shè)計(jì)模式的必經(jīng)之路。
本書(shū)特色
本書(shū)采用老師與學(xué)生對(duì)話的形式進(jìn)行講解,為此我虛構(gòu)了兩個(gè)人物:學(xué)生是初入職場(chǎng)的程序員兔小白,老師是有著多年經(jīng)驗(yàn)的開(kāi)發(fā)經(jīng)理熊小貓。
本書(shū)的寫(xiě)作特色如下。
(1)模擬一對(duì)一教學(xué)場(chǎng)景。技術(shù)圖書(shū)通常是作者以第一人稱進(jìn)行講解的,給我的閱讀感受像是在聽(tīng)一位老師講課。本書(shū)模擬一對(duì)一教學(xué)場(chǎng)景:我先站在老師的角度講解,通過(guò)提問(wèn)啟發(fā)學(xué)生;然后切換身份,想象自己作為學(xué)生,在聽(tīng)完這段講解后會(huì)提出什么問(wèn)題。本書(shū)試圖為讀者營(yíng)造身臨其境地接受一對(duì)一教學(xué)的感受,在一問(wèn)一答中探索設(shè)計(jì)模式的奧秘。
(2)從熟悉的生活場(chǎng)景切入。從日常生活中的一個(gè)小故事開(kāi)始對(duì)每種設(shè)計(jì)模式進(jìn)行講解,讓讀者通過(guò)身邊熟悉的事物來(lái)聯(lián)想并了解設(shè)計(jì)模式。
(3)重現(xiàn)程序設(shè)計(jì)的演變過(guò)程。本書(shū)在提出問(wèn)題后,并不立即使用設(shè)計(jì)模式解決問(wèn)題,而是先從直覺(jué)化的程序設(shè)計(jì)開(kāi)始,逐步演變到如何使用設(shè)計(jì)模式開(kāi)發(fā)。熊小貓啟發(fā)兔小白重構(gòu)程序的過(guò)程正是開(kāi)發(fā)者設(shè)計(jì)程序時(shí)的思考過(guò)程。
(4)大量的手繪插畫(huà)。在講解關(guān)鍵概念時(shí),配以漫畫(huà)輔助理解。人腦更樂(lè)于接收?qǐng)D像信息,對(duì)圖像的記憶長(zhǎng)度要遠(yuǎn)超文字。幽默風(fēng)趣的漫畫(huà)不僅可以加深印象,而且可以緩解學(xué)習(xí)時(shí)的枯燥感。
(5)獨(dú)有的設(shè)計(jì)手法。設(shè)計(jì)原則是程序設(shè)計(jì)的理論基石,設(shè)計(jì)模式是特定問(wèn)題的方案總結(jié)。二者之間其實(shí)還有很多設(shè)計(jì)小技巧,我稱之為設(shè)計(jì)手法。設(shè)計(jì)手法不針對(duì)特定問(wèn)題,而是達(dá)成設(shè)計(jì)原則的小技巧,不同的設(shè)計(jì)模式使用同樣的設(shè)計(jì)手法。這好比在足球運(yùn)動(dòng)中,踢出弧線球是一種技巧,弧線球既可以用在傳球的場(chǎng)景中,也可以用在射門(mén)的場(chǎng)景中。
本書(shū)內(nèi)容
軟件需要架構(gòu),圖書(shū)同樣需要架構(gòu)。本書(shū)的內(nèi)容架構(gòu)分為3個(gè)部分。
第一部分為開(kāi)篇,在正式講解設(shè)計(jì)模式之前,簡(jiǎn)要介紹設(shè)計(jì)模式和設(shè)計(jì)原則。
第1章設(shè)計(jì)模式從何而來(lái),主要介紹設(shè)計(jì)模式產(chǎn)生的背景。
第2章一體式電源與組合式電源軟件設(shè)計(jì)原則,通過(guò)設(shè)計(jì)電腦電源的案例引出六大設(shè)計(jì)原則。
第二部分進(jìn)入正題,講解23種設(shè)計(jì)模式。
第3章想吃漢堡,自己做還是去漢堡店?簡(jiǎn)單工廠模式,通過(guò)兔小白如何取得一個(gè)漢堡的例子,引出簡(jiǎn)單工廠模式。簡(jiǎn)單工廠模式雖然簡(jiǎn)單且不在23種設(shè)計(jì)模式中,但是體現(xiàn)了多種設(shè)計(jì)原則。
第4章座座工廠平地起工廠方法模式,以專精程度更高的廚房為例,引出工廠方法模式。
第5章工廠品類要豐富抽象工廠模式,通過(guò)便利店更換關(guān)東煮供貨商的例子,引出抽象工廠模式,并對(duì)3種工廠模式進(jìn)行比較。
第6章組裝電腦的學(xué)問(wèn)生成器模式,通過(guò)總監(jiān)負(fù)責(zé)電腦組裝流程、工人負(fù)責(zé)具體步驟的例子,講解生成器模式。
第7章還記得克隆羊多莉嗎?原型模式,通過(guò)克隆羊的例子,引出原型模式。
第8章干活全靠我一人單例模式,通過(guò)項(xiàng)目經(jīng)理身兼數(shù)職的例子,講解單例模式。
第9章電源插座標(biāo)準(zhǔn)再多也不怕適配器模式,通過(guò)電源轉(zhuǎn)接頭的例子,講解適配器模式。
第10章一橋飛架南北,天塹變通途橋接模式,通過(guò)游戲機(jī)和游戲卡分離的例子,講解橋接模式。
第11章樹(shù)狀結(jié)構(gòu)也是一種設(shè)計(jì)模式?組合模式,通過(guò)公司人力地圖的例子,講解組合模式。
第12章人靠衣裝馬靠鞍裝飾模式,以美顏相機(jī)為例,講解裝飾模式。
第13章為什么加盟快餐店越來(lái)越多?外觀模式,通過(guò)以加盟模式開(kāi)快餐店的例子,講解外觀模式。
第14章棋類游戲中的設(shè)計(jì)模式享元模式,以在消消樂(lè)游戲中如何避免生成大量棋子實(shí)例為例,講解享元模式。
第15章辦事不必親自出面代理模式,以代理辦理簽證為例,講解代理模式。
第16章誰(shuí)來(lái)決定需求變更的命運(yùn)?職責(zé)鏈模式,以項(xiàng)目的一次需求變更審批為例,講解職責(zé)鏈模式。
第17章操作再多,也不必手忙腳亂命令模式,以項(xiàng)目上線時(shí)團(tuán)隊(duì)成員如何配合為例,講解命令模式。
第18章點(diǎn)菜也需要翻譯解釋器模式,通過(guò)飯店點(diǎn)菜終端將鍵盤(pán)輸入轉(zhuǎn)化為點(diǎn)菜單的例子,講解解釋器模式。
第19章地鐵安檢,誰(shuí)都逃不掉迭代器模式,以地鐵排隊(duì)安檢為例,講解迭代器模式,并介紹Java中的迭代器實(shí)現(xiàn)。
第20章房產(chǎn)中介的存在價(jià)值中介者模式,以房產(chǎn)中介在租房業(yè)務(wù)中的作用為例,講解中介者模式。
第21章物業(yè)通知,每戶必達(dá)觀察者模式,以物業(yè)發(fā)布通知為例,講解觀察者模式,并介紹Java中的觀察者模式實(shí)現(xiàn)。
第22章甲方要求改回第一版?zhèn)渫浤J,以?shù)次改版演唱會(huì)海報(bào)設(shè)計(jì)為例,講解備忘錄模式。
第23章?tīng)顟B(tài)改變行為狀態(tài)模式,以將立體車庫(kù)的行為綁定在運(yùn)行狀態(tài)上為例,講解狀態(tài)模式。
第24章購(gòu)買手機(jī)選項(xiàng)多,如何選購(gòu)是難題策略模式,以根據(jù)不同的策略選購(gòu)手機(jī)為例,講解策略模式。
第25章遵循套路,不走彎路模板方法模式,以自動(dòng)擋和手動(dòng)擋汽車的起步操作為例,講解模板方法模式。
第26章尊重個(gè)體差異,提供個(gè)性化服務(wù)訪問(wèn)者模式,以不同級(jí)別員工的年終獎(jiǎng)計(jì)算差異為例,講解訪問(wèn)者模式。
第三部分總結(jié)23種設(shè)計(jì)模式,提煉設(shè)計(jì)手法。
第27章設(shè)計(jì)模式總結(jié),總結(jié)了面向?qū)ο、設(shè)計(jì)原則、設(shè)計(jì)模式三者的關(guān)系,并講解從23種設(shè)計(jì)模式中提煉出來(lái)的10種設(shè)計(jì)手法。