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