描述
內容簡介
用簡單易懂的漫畫帶你學習設計模式!
►從實際案例探究設計模式,讓程式更易維護 ►設計原則聚焦需求變動,預留彈性空間 ►工廠家族(簡單、方法、抽象)應對不同生產需求 ►生成器與原型模式,靈活構建與複製物件 ►單例模式:獨佔資源,集中管理關鍵邏輯 ►轉接器與橋接模式,化解介面衝突,分離抽象與實現 ►組合模式與裝飾模式,輕鬆應對結構與功能的複雜組合 ►面板(外觀)與享元模式,封裝系統複雜度、共用重複資源 ►代理模式:隔離繁瑣流程,提供便捷替代 ►職責鏈、命令、仲介者等行為模式,強化溝通與流程控管 ►觀察者與備忘錄模式,監控狀態並保留歷史 ►狀態、策略、範本方法、存取者模式,讓程式更具彈性可擴充
本書共三大部分,說明物件導向與六大設計原則的關係。接著分別說明簡單工廠、工廠方法、抽象工廠、生成器、原型、單例與轉接器等模式,並以各種生活與專案場景示範其應用。然後討論橋接、組合、裝飾、面板、享元與代理模式,之後闡述職責鏈、命令、解譯器、迭代器、仲介者、觀察者、備忘錄、狀態、策略、範本方法及存取者模式,最後整理並統合設計手法,強調物件導向思維與模式選用原則,帶領讀者掌握系統架構與程式維護的要訣。 讀完開篇部分,可先了解設計模式緣起與原則概念,然後深入學習第二部分二十三種模式所代表的核心思路,並透過實例實践予以理解與應用。 |
作者簡介
|
目錄
第1章 設計模式從何而來
1.1 當我們談論設計模式時,我們在談論什麼 1.2 身邊隨處可見的設計模式 1.3 學懂不等於會用
第2章 一體式電源與組合式電源 —— 軟體設計原則 2.1 需求又變更?——設計為變化而生 2.2 優秀軟體設計的特徵 2.3 程式設計原則 2.4 手拿錘子,眼裡都是釘子
第3章 想吃漢堡,自己做還是去漢堡店? —— 簡單工廠模式 3.1 速食店中的簡單工廠 3.2 商品推薦功能初版程式 3.3 實現開閉原則和單一職責原則 3.4 推薦器工廠實現依賴倒置 3.5 簡單工廠模式的適用場景
第4章 座座工廠平地起——工廠方法模式 4.1 打造工廠標準——工廠再抽象 4.2 多種廚房,各盡其責 4.3 多種工廠,切換自如 4.4 需求膨脹,工廠也膨脹 4.5 工廠的工廠?抽象要適度 4.6 工廠方法模式的適用場景
第5章 工廠品類要豐富——抽象工廠模式 5.1 供應商不靠譜?直接換掉 5.2 商品詳情頁的程式實現 5.3 一鍵切換不同主題的元件 5.4 抽象工廠模式的適用場景 5.5 簡單工廠、工廠方法、抽象工廠模式的比較
第6章 組裝電腦的學問——生成器模式 6.1 職級制度的利與弊 6.2 只有組裝工人的電腦公司 6.3 聘用了總監的電腦公司 6.4 生成器模式的適用場景
第7章 還記得複製羊桃莉嗎?——原型模式 7.1 像複製綿羊一樣寫程式 7.2 按部就班,一張一張建立節目單 7.3 如何高效建立100 張節目單 7.4 深拷貝和淺拷貝 7.5 原型模式的適用場景
第8章 幹活全靠我一人——單例模式 8.1 異常忙碌的專案經理 8.2 懶漢式實現單例模式 8.3 餓漢式實現單例模式 8.4 單例模式的適用場景
第9章 電源插座標準再多也不怕——轉接器模式 9.1 出國旅遊遇難題 9.2 轉接器模式程式實現 9.3 拓展轉接器模式,實現雙向可抽換 9.4 轉接器模式的適用場景
第10章 一橋飛架南北,天塹變通途——橋接模式 10.1 將手臂改造為兵器,聰明還是愚蠢 10.2 只能玩一個遊戲的遊戲主機 10.3 一台插卡遊戲主機,玩遍天下遊戲 10.4 橋接模式的適用場景
第11章 樹狀結構也是一種設計模式嗎?——組合模式 11.1 人力地圖中的設計模式 11.2 只有內部員工的人力地圖 11.3 外協員工也要一視同仁 11.4 組合模式的適用場景
第12章 人靠衣裝佛靠金裝——裝飾模式 12.1 功能強大的美顏相機 12.2 不可以隨意組合美顏效果的美顏相機 12.3 可以隨意組合美顏效果的美顏相機 12.4 裝飾模式的優缺點及適用場景
第13章 為什麼加盟速食店越來越多?——面板模式 13.1 如何開一家飯店 13.2 獨立開店,我的店面我做主 13.3 加盟開店,輕鬆自如 13.4 面板模式的適用場景
第14章 棋類遊戲中的設計模式——享元模式 14.1 五子棋需要多少枚棋子 14.2 一枚棋子一個實例 14.3 一類棋子一個實例 14.4 享元模式的優缺點及適用場景 14.5 享元模式與單例模式的比較
第15章 辦事不必親自出面——代理模式 15.1 辦理簽證是件麻煩事 15.2 自己辦理簽證 15.3 代理人協助辦理簽證 15.4 代理模式的適用場景 15.5 代理模式與裝飾模式的比較
第16章 誰來決定需求變更的命運?——職責鏈模式 16.1 專案臨近上線,需求又變更 16.2 被指派的審核人 16.3 掌握主動權的審核人 16.4 職責鏈模式的優缺點及適用場景
第17章 操作再多,也不必手忙腳亂——命令模式 17.1 專案上線前的準備 17.2 專案經理獨攬大權 17.3 開發經理加入專案 17.4 開發經理掌控全域 17.5 命令模式的優缺點及適用場景
第18章 點菜也需要翻譯——解譯器模式 18.1 記憶力驚人的服務員 18.2 解析點菜命令的原理 18.3 使用解譯器模式實現點菜系統 18.4 解譯器模式的適用場景 18.5 解譯器模式與組合模式的比較
第19章 捷運安檢,誰都逃不掉——迭代器模式 19.1 兔小白上班遲到 19.2 迭代只是寫for 迴圈嗎 19.3 迭代不只有for 迴圈 19.4 詳解迭代器模式 19.5 淺析Java 中的迭代器
第20章 房產仲介的存在價值——仲介者模式 20.1 仲介的價值有幾何 20.2 讓仲介出局會怎樣 20.3 仲介協調,多方受益 20.4 仲介者模式的優缺點及適用場景
第21章 管委會通知,每戶必達——觀察者模式 21.1 沒有送達的停水通知 21.2 將房主和房客分開通知 21.3 對房主和房客一視同仁 21.4 觀察者模式的優缺點及適用場景 21.5 Java 內建的觀察者模式實現
第22章 甲方要求改回第一版——備忘錄模式 22.1 來自設計師的無奈 22.2 「複製」實現海報設計存檔 22.3 存檔「瘦身」,只留資料 22.4 備忘錄模式的適用場景
第23章 狀態改變行為——狀態模式 23.1 立體停車場如何運轉 23.2 停車場的狀態決定行為實現 23.3 為停車場的狀態綁定行為 23.4 狀態模式的優缺點及適用場景
第24章 購買手機選項多,如何選購是難題——策略模式 24.1 如何挑選一部手機 24.2 用簡單工廠模式實現手機推薦程式 24.3 加入推薦人的手機推薦程式 24.4 策略模式的適用場景 24.5 策略模式與簡單工廠模式的比較和結合
第25章 遵循策略,不走彎路——範本方法模式 25.1 自駕草原行,意外出事故 25.2 程式出Bug,不掛擋也能開車 25.3 汽車起步操作範本化 25.4 範本方法模式的適用場景 25.5 範本方法模式與策略模式的比較和結合
第26章 尊重個體差異,提供個性化服務——存取者模式 26.1 如何計算年終獎 26.2 循規蹈矩的程式實現 26.3 行為可擴充的程式實現 26.4 存取者模式的優缺點及適用場景
第27章 設計模式總結 27.1 回到設計模式的起點 27.2 10 種常用的設計手法 27.3 實踐是唯一出路 27.4 尾聲 |
序
前言
寫作背景 我想先從自己第一次接觸設計模式說起,這段回憶並不美好。 在畢業後的第二年,我在一次面試中被問到設計模式。當時的我甚至沒有聽說過設計模式,鎩羽而歸後,我便下定決心要攻克它。首先,我閱讀的是《設計模式:可重複使用物件導向軟體的基礎》,但很快便敗下陣來。這本被奉為「設計模式聖經」的著作,由於偏學術的行文風格,以及理論化的講解,使像我這樣的初學者難以理解。此外,書中的例子用C++ 和Smalltalk 語言撰寫,對像我這樣的Java 程式設計師來說更是雪上加霜。當然,《設計模式:可重複使用物件導向軟體的基礎》一書是無可撼動的經典。時至今日,每次翻閱它時,我都會有新的感悟。只是對當時的我來說,它的學習門檻有些高。 之後,我又找了幾本適合初學者的設計模式圖書,在系統學完後,可以說,設計模式顛覆了我對軟體開發的認知。那些枯燥的程式,變得鮮活起來;那些抽象的程式,變得具象起來。曾經被「奴役」於程式之中的我,現在卻像一位「造物主」,在軟體世界中「呼風喚雨」。 在體會到設計模式的美妙之後,我開始向身邊的朋友推薦,朋友也驚歎道:「程式竟然還能這麼寫!」在工作中,我開始「刻意」使用設計模式,現在回想起來,屬實有過度設計之嫌,但大量的設計經驗也是在此過程中累積下來的。 在近幾年的工作中,我更加追求程式的重複使用性、複雜度及開發成本的平衡。合理的選擇同樣少不了設計模式的知識做支撐。 誠然,市面上已經存在很多優秀的設計模式圖書,但以漫畫形式撰寫的設計模式圖書還很少。我兒時喜愛畫畫,也曾在少年宮學習,但由於和奧數課衝突,只能遺憾作罷。可是誰又能想到,在命運的齒輪轉動30 年後,我能將愛好與專業相結合,寫了一本書。 我第一次嘗試漫畫形式的技術寫作是在2018 年。此後,我寫作的一篇名為《圖文徹底搞懂非對稱加密》的漫畫技術文章,累計閱讀量超10 萬次,並收穫了很多正面的評價。我發現,在講解枯燥技術的文章中適當穿插幽默、風趣的漫畫,不但有助讀者理解,而且能調動讀者的閱讀興趣。從此,我更加堅定地以漫畫形式創作技術文章。 在本書中,我用「在情景對話中穿插漫畫」的形式講解設計模式,希望本書能帶給讀者一種全新的學習體驗。如果讀者在深入技術學習時還能開心一笑,我會倍感欣慰。
學習建議 在閱讀本書前,首先,需要具備Java 語言或其他物件導向語言的程式設計基礎。為了降低閱讀門檻,書中程式盡可能使用最基本的語法,對程式設計水準的要求並不高。其次,需要了解物件導向的特性——封裝、繼承、多態。書中有大量的程式結構圖,只要具備基礎的UML 知識,便可以讀懂。 我建議,設計模式的初學者先閱讀本書的前兩章,在對設計模式有了一定程度的認知,並了解設計原則後,再開始學習各種設計模式。若在學習之初難以完全理解設計原則也不必擔心,在後面的章節中,我會結合設計模式多次講到常見的設計原則。書中對每種設計模式的講解獨立成章,讀者既可以按順序閱讀,也可以按照自己的需要選擇閱讀。 本書從生活中常見的例子切入,展開對每種設計模式的講解。讀者可以跟隨這些例子拓展思維,思考這樣設計帶來了什麼收益、涉及哪些主體、主體間如何配合、各自的職責是什麼。設計模式是一種思想,學習設計模式重在悟透設計思想,而非急於用程式實現。 書中有大量的範例程式,建議讀者在閱讀的同時動手實踐,以便加深記憶和理解。在工作中,如果想使用某種設計模式,可以參考這些程式,但真實的場景遠比書中的例子複雜得多。讀者可以先從形式上開始模仿,當能夠靈活運用設計思想解決問題時,形式反而沒那麼重要了。大膽應用,是真正掌握設計模式的必經之路。
本書特色 本書採用老師與學生對話的形式進行講解,為此我虛構了兩個人物:學生是初入職場的程式設計師——兔小白,老師是有著多年經驗的開發經理——熊小貓。 本書的寫作特色如下。 (1)模擬一對一教學場景。技術圖書通常是作者以第一人稱進行講解的,給我的閱讀感受像是在聽一位老師講課。本書模擬一對一教學場景:我先站在老師的角度講解,透過提問啟發學生;然後切換身份,想像自己作為學生,在聽完這段講解後會提出什麼問題。本書試圖為讀者營造身臨其境地接受一對一教學的感受,在一問一答中探索設計模式的奧秘。 (2)從熟悉的生活場景切入。從日常生活中的小故事開始對每種設計模式進行講解,讓讀者透過身邊熟悉的事物來聯想並了解設計模式。 (3)重現程式設計的演變過程。本書在提出問題後,並不立即使用設計模式解決問題,而是先從直覺化的程式設計開始,逐步演變到如何使用設計模式開發。熊小貓啟發兔小白重構程式的過程正是開發者設計程式時的思考過程。 (4)大量的手繪插畫。在講解關鍵概念時,配以漫畫輔助理解。人腦更樂於接收影像資訊,對影像的記憶長度要遠超文字。幽默風趣的漫畫不僅可以加深印象,而且可以緩解學習時的枯燥感。 (5)獨有的設計手法。設計原則是程式設計的理論基石,設計模式是特定問題的方案總結。二者之間其實還有很多設計小技巧,我稱之為「設計手法」。設計手法不針對特定問題,而是達成設計原則的小技巧,不同的設計模式使用同樣的設計手法。這好比在足球運動中,踢出弧線球是一種技巧,弧線球既可以用在傳球的場景中,也可以用在射門的場景中。
本書內容 軟體需要架構,圖書同樣需要架構。本書的內容架構分為3 個部分。 第一部分為開篇,在正式講解設計模式之前,簡介設計模式和設計原則。 第1 章「設計模式從何而來」,主要介紹設計模式產生的背景。 第2 章「一體式電源與組合式電源——軟體設計原則」,透過設計電腦電源的案例引出六大設計原則。 第二部分進入正題,講解23 種設計模式。 第3 章「想吃漢堡,自己做還是去漢堡店?——簡單工廠模式」,透過兔小白如何取得一個漢堡的例子,引出簡單工廠模式。簡單工廠模式雖然簡單且不在23 種設計模式中,但是表現了多種設計原則。 第4 章「座座工廠平地起——工廠方法模式」,以專精程度更高的廚房為例,引出工廠方法模式。 第5 章「工廠品類要豐富——抽象工廠模式」,透過便利商店更換關東煮供應商的例子,引出抽象工廠模式,並對3 種工廠模式進行比較。 第6 章「組裝電腦的學問——生成器模式」,透過總監負責電腦組裝流程、工人負責具體步驟的例子,講解生成器模式。 第7 章「還記得複製羊桃莉嗎?——原型模式」,透過複製羊的例子,引出原型模式。 第8 章「幹活全靠我一人——單例模式」,透過專案經理身兼數職的例子,講解單例模式。 第9 章「電源插座標準再多也不怕——轉接器模式」,透過電源轉接頭的例子,講解轉接器模式。 第10 章「一橋飛架南北,天塹變通途——橋接模式」,透過遊戲主機和遊戲卡分離的例子,講解橋接模式。 第11 章「樹狀結構也是一種設計模式?——組合模式」,透過公司人力地圖的例子,講解組合模式。 第12 章「人靠衣裝佛靠金裝——裝飾模式」,以美顏相機為例,講解裝飾模式。 第13 章「為什麼加盟速食店越來越多?——面板模式」,透過以加盟模式開速食店的例子,講解面板模式。 第14 章「棋類遊戲中的設計模式——享元模式」,以在消消樂遊戲中如何避免生成大量棋子實例為例,講解享元模式。 第15 章「辦事不必親自出面——代理模式」,以代理辦理簽證為例,講解代理模式。 第16 章「誰來決定需求變更的命運?——職責鏈模式」,以專案的一次需求變更審核為例,講解職責鏈模式。 第17 章「操作再多,也不必手忙腳亂——命令模式」,以專案上線時團隊成員如何配合為例,講解命令模式。 第18 章「點菜也需要翻譯——解譯器模式」,透過飯店點菜終端將鍵盤輸入轉化為點選單的例子,講解解譯器模式。 第19 章「地鐵安檢,誰都逃不掉——迭代器模式」,以地鐵排隊安檢為例,講解迭代器模式,並介紹Java 中的迭代器實現。 第20 章「房產仲介的存在價值——仲介者模式」,以房產仲介在租房業務中的作用為例,講解仲介者模式。 第21 章「管委會通知,每戶必達——觀察者模式」,以管委會發佈通知為例,講解觀察者模式,並介紹Java 中的觀察者模式實現。 第22 章「甲方要求改回第一版——備忘錄模式」,以數次改版演唱會海報設計為例,講解備忘錄模式。 第23 章「狀態改變行為——狀態模式」,以將立體車庫的行為綁定在運行狀態上為例,講解狀態模式。 第24 章「購買手機選項多,如何選購是難題——策略模式」,以根據不同的策略選購手機為例,講解策略模式。 第25 章「遵循策略,不走彎路——範本方法模式」,以自排和手排汽車的起步操作為例,講解範本方法模式。 第26 章「尊重個體差異,提供個性化服務——存取者模式」,以不同等級員工的年終獎計算差異為例,講解存取者模式。 第三部分總結23 種設計模式,提煉設計手法。 第27 章「設計模式總結」,總結了物件導向、設計原則、設計模式三者的關係,並講解從23 種設計模式中提煉出來的10 種設計手法。
建議和回饋 寫書的工作極其瑣碎、繁重,雖然我已盡力確保書中內容的準確性,但由於個人能力有限,難免出現疏漏和瑕疵,歡迎讀者批評指正。
致謝 首先,感謝我的父母。我的父親高中畢業5 年後,在恢復學測的第二年考入大學,從此,知識改變命運的道理深植於他的心中。他非常重視對我的教育,沒有他的培養,就不可能有這本書。我的母親是一位很有耐心的慈母,做任何事情都一絲不苟、追求極致。她的這種品質也一直影響著我,支撐我完成一次次對書稿的修改。 特別感謝我的妻子,沒有她的理解和支持,我不可能完成本書。我寫書的這半年,她承擔起家庭的重任,讓我能專注於寫作。 特別感謝我的兩個孩子,他們時常會關注我的寫作進度,翻看我畫的漫畫,和我說:「等到出版了,送我們一本。」孩子們每天開心的笑容,也是我寫作的動力。 特別感謝我的朋友張龍對我從事技術寫作的影響。感謝Thoughtworks 洞見主編張凱峰在技術寫作和建構影響力上給予我的指導和幫助。 特別感謝在網路上給予我鼓勵的朋友們。沒有你們,我不可能在技術寫作的道路上堅持這麼久。 最後,特別感謝我的編輯張爽。記得那是一個炎熱的下午,我在微信上收到了她的出書邀約。我欣然接受,仿佛看到另一扇門向我敞開。她給予了我很多寫作建議,在她的幫助下,這本書才能順利完成。 感謝每一位幫助過我的家人、朋友和同事⋯⋯ 我由衷地希望本書能夠給讀者帶來一些幫助,以反應你們的支持! 李一鳴 |