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