這是一本通俗易懂、妙趣橫生的設計模式書籍,作者將帶領讀者進入物件導向程式設計的禪道三重境界。
►一重境界:依葫蘆畫瓢。這屬於初學階段,以為設計模式只有書中提到的那幾種,能把模式名稱倒背如流,但真正要用時,還得去翻書,依據類別圖照搬照改。
►二重境界:靈活運用。這屬於中級階段,即對每一種設計模式都非常熟悉,有較深入的思考,而且能夠根據實際的業務場景選擇合適的模式,並對相應的模式進行恰當的修改以符合實際需求。
►三重境界:心中無模式。這算最終階段,這裡說無模式並非不使用設計模式,而是設計模式的理念已經融入使用者的靈魂和血液,已經不在乎具體使用哪種通用模式了,但寫出的每一個程式碼都遵循設計的原則,能靈活地創造和使用新的模式(這種模式使用者自己可能也不知道該叫什麼)。這就是所謂的心中無模式卻處處有模式。
全書分為3篇:
■「基礎篇」 講解23種經典設計模式,其中19種常用設計模式分別用單獨的章節講解,其餘設計模式放在一章中講解。
■「進階篇」 講解由基礎設計模式衍生出的各種程式設計機制,包括篩檢程式模式、物件集區技術、回檔機制和MVC模式,它們在各大程式設計語言中都非常重要而且常見。
■「經驗篇」 結合工作經驗和專案積累,分享對設計模式、設計原則、專案重構的理解和看法。
適合讀者群:互聯網軟體開發者、有一定程式設計基礎的IT職場新人、對設計模式和程式設計思維感興趣者。
本書特色
►本書通俗易懂、妙趣橫生
►生活經歷、融入設計模式
►心中無模式卻處處有模式
►邁向程式碼重構與簡潔之道
作者簡介:
羅偉富(Spencer.Luo)
CSDN 博客專家,知名線上教育公司技術專家。
從事後端基礎技術研究,從底層到應用層,從前端到後端積累豐富的開發經驗,熟悉 C 、Java、Python、PHP 等多種不同開發語言。
熱愛生活、喜歡技術、善於用生活的場景解讀難懂的技術!
作者序
前言
三年前,CSDN 推出了一個產品——ink,旨在提供一個高品質寫作環境。那時,我想寫一系列關於設計模式的文章,於是就在ink 裡開始寫作,陸陸續續寫了三篇文章,後來不知道什麼原因這個產品下架了,我的三篇文章也沒了,這事也就一直被我擱置下來。直到2017 年,知識付費盛行,各類付費的社區、產品如雨後春筍般崛起,而技術類的付費閱讀產品更是大行其道(GitChat 便是其中一種)。在GitChat 的盛情邀請之下,我寫作設計模式這一系列文章的想法又重新被點燃。2017 年年底,我開始在GitChat 上寫「從生活中領悟設計模式(Python)」課程。2018 年,我對這一課程進行了一次升級。
隨著這一課程被越來越多的讀者熟知,不少出版社編輯找到我,他們覺得這一課程的內容非常有特色,希望能把它重新整理,出版成書,於是便有了本書。
本書的特色
設計模式作為物件導向程式的設計思維和方法論,本身是非常抽象和難以理解的,需要有一定的程式碼量和程式設計經驗才能更深入地理解。如果能用一種有趣的方式來講解設計模式,將會使這些枯燥乏味的概念變得更易於理解!
本書每一章以一個輕鬆有趣的小故事開始,然後用程式碼來模擬故事劇情,再從模擬程式碼中逐步提煉出設計模式的模型和原理,最後配合一個具體的應用案例,告訴你每一種模式的使用方法和應用場景。以由淺入深的方式帶你瞭解每一種模式,思考每一種模式,總結每一種模式。
本書力求用更通俗的語言闡述難懂的概念,用更簡單的語法實現複雜的邏輯,用更短小的程式碼寫出強悍的程式!希望能帶給讀者一種全新的閱讀體驗和思考方式。
內容概述
本書分為3 篇:
• 「基礎篇」講解了23 種經典設計模式,其中19 種常用設計模式分別用單獨的章節講解,其餘設計模式作為一個合集放在一章中講解;
• 「進階篇」講解了由基礎設計模式衍生出的各種程式設計機制,包括篩檢程式模式、物件集區技術、回檔機制和MVC 模式,它們在各大程式設計語言中都非常重要而且常見;
• 「經驗篇」結合工作經驗和專案積累,分享了對設計模式、設計原則、專案重構的理解和看法。
讀者對象
一線互聯網軟體發展者
如果你想提升物件導向的思維方式,提高自己的軟體設計能力,本書會對你非常有幫助。本書每一章會抽象和總結出對應設計模式的模型和原理,並結合具體的應用案例告訴你該模式的應用場景、特點和注意事項。
IT 職場新人
如果你是IT 新人,想透過學習設計模式來提升自己的技術能力和程式碼理解能力,本書將非常適合你。本書每一章以一個輕鬆有趣的小故事開始,由淺入深地講述一個模式,讓你輕鬆愉悅地學會每一種模式。
對設計模式和程式設計思維感興趣的人士
設計模式能讓你的程式碼具有更高的再使用性、更好的靈活性和可拓展性,更易被人閱讀和理解,因此學習設計模式是每一個程式師程式設計生涯中必不可少的一個環節。
為什麼叫設計模式
什麼是設計模式
設計模式最初是由GoF 於1995 年提出的。GoF 全稱是Gang of Four(四人幫),即Erich Gamma、Richard Helm、Ralph Johnson 和John Vlissides。他們四人於1995年出版了一本書Design Patterns: Elements of Reusable Object-Oriented Software(翻譯成中文是《設計模式:可複用物件導向軟體的基礎》),第一次將設計模式提升到理論高度,並將之規範化,該書提出了23 種經典的設計模式。
設計模式是一套被反覆使用、多數人知曉、無數工程師實踐的程式碼設計經驗的總結,它是物件導向思維的高度提煉和範本化。使用設計模式是為了讓程式碼具有更高的再使用性、更好的靈活性和可拓展性,更易被人閱讀和理解。
設計模式與生活有什麼聯繫
我一直堅信:程式源于生活,又高於生活!程式的靈魂在於思維的方式,而思維的靈感來源於精彩的生活。互聯網是一個虛擬的世界,而程式本身就是對生活場景的虛擬和抽象,每一種模式我都能在生活中找到它的影子。比如,說到狀態模式,我能想到水有固、液、氣三種狀態,而人也有少、壯、老三個階段;提起仲介模式,我能立刻想到房產仲介;看到裝飾模式,我能聯想到人的穿衣搭配⋯⋯
設計模式是物件導向的高度抽象和總結,而越抽象的東西越難以理解。本書的寫作目的就是降低設計模式的閱讀門檻,以生活中的小故事開始,用風趣的方式,由淺入深地講述每一種模式。讓你再次看到設計模式時,不覺得它只是一種模式,還是生活中的一個「小確幸」!程式不是冷冰冰的程式碼,它還有生活的樂趣和特殊意義。
為什麼要學設計模式
設計模式是軟體發展人員在軟體發展過程中面臨的一般問題的解決方案。這些解決方案是眾多軟體發展人員經過相當長的一段時間的試驗總結出來的。所以不管你是新手還是老手,學習設計模式對你都有莫大的幫助。
學習設計模式的理由有很多,這裡只列出幾個最實際的:
(1)擺脫面試的窘境,不管你是前端工程師還是後端工程師,或是全端工程師,設計模式都是不少面試官必問的。
(2)讓你的程式設計能力有一個質的提升,不再寫一堆結構複雜、難以維護的爛程式碼。
(3)使你對物件導向的思維有一個更高層次的理解。
如何進行學習
熟悉一門物件導向語言
首先,你至少要熟悉一門物件導向的電腦語言。如果沒有,請根據自己的興趣、愛好或希望從事的工作,先選擇一門物件導向語言(C++、Java、Go、Python 等都可以)進行學習和實戰,對抽象、繼承、多態、封裝有一定的基礎之後,再來閱讀本書。
本書是以Python 為實作物件導向之電腦語言。
瞭解Python 的基本語法
對Python 的基本語法有一個簡單瞭解。Python 的語法非常簡單,只要你有一定的(其他)程式設計語言基礎,透過「第0 章 啟程之前,請不要錯過我」的學習就能很快地理解Python 的語法。
學會閱讀UML 圖
UML(Unified Modeling Language)稱為統一模組化語言或標準建模語言,是物件導向軟體的標準化建模語言。UML 類別圖表示不同的實體(人、事物和資料)如何彼此相關,換句話說,它顯示了系統的靜態結構。想進一步瞭解類別圖中的各種關係,可參考閱讀「第0 章 啟程之前,請不要錯過我」的「0.2 UML 精簡概述」部分。
閱讀本書
透過閱讀本書內容,可以輕鬆愉快地學習設計模式和程式設計思維。本書「基礎篇」「進階篇」「經驗篇」的內容是逐步進階和提升的,但每一篇內的不同章之間是沒有閱讀的先後順序的(第0 章和有特殊說明的除外),每一章都單獨成文,可從任意一章開始閱讀。例如,對於基礎篇的23 種設計模式,你可以從中任意挑選一章開始閱讀。
為什麼選擇Python
雖然設計模式與程式設計語言沒有關係,它是對物件導向思維的靈活應用和高度概括,你可以用任何一種語言來實現它,但總歸是需要用一種語言進行舉例的。本書的所有程式實例均使用Python 編寫(有特殊說明的除外),選擇Python 主要基於以下兩個原因。
彌補市場空缺
設計模式於1995 由GoF 提出,被廣泛應用於熱門的物件導向語言。目前用Java、C++ 描述的設計模式的書籍和資料已經非常多了,但用Python 來描述的真是太少了;我在當當網上搜尋「Python 設計模式」,只有零星的幾本書。而對於程式設計語言中排名第一的Python 語言,這明顯是不夠的。Python 已經越來越成熟,也越來越多地被使用,作為一個追求技術的IT 人,有必要瞭解以Python 程式碼為基礎的設計模式。
大勢所趨,Python 已然成風
C 語言誕生於1972 年,卻隨著UNIX 的誕生才深深根植於各大作業系統;C++ 誕生於1983 年,卻因微軟的視覺化桌面作業系統才得以廣泛傳播;Java 誕生於1995 年,卻因互聯網的迅速崛起才變得家喻戶曉;Python 誕生於1991 年,而下一場技術革命已然開始,AI 時代已然到來,在AI 領域中已經被廣泛使用的Python 必將成為下一個時代的第一開發語言!
最熱門的AI 開源框架PyTorch 和TensorFlow 都已經採用Python 作為介面和開發語言。除此之外,還有一堆AI 相關的框架庫,也都紛紛採用了Python,如SKlearn、PyML 等。一門如此有前途的語言,我們必然是要去學習和使用的。
勘誤和支持
由於本人水準和經驗有限,書中難免會有一些錯誤或理解不準確的地方,懇請廣大讀者批評指正。
如果你在閱讀過程中發現錯誤,或有更好的建議,歡迎發郵件給我(E-mail:luoweifu@ 126.com,永久有效)。
最新的勘誤內容可透過以下方式查看:關注公眾號「SunLogging」,在功能表列中選擇「我的書箱」→「最新勘誤」。
致謝
從在GitChat 上寫課程,到與出版社合作,寫完本書的書稿,大概經歷了一年半的時間,經過無數次與編輯的反覆校對。寫作是一件非常考驗人耐心和細心的事,為了讓讀者更易理解,有些章節我進行了反覆的推敲和修改。比如,為了講清楚單例模式的每一種實現方式的原理,硬是增加兩個附錄,閱讀了十幾篇文章,並做了驗證性的實驗,整整花了三周時間才寫完。
感謝每一位在本書寫作過程中給予幫助的人,是你們的鼓勵和支持,才讓本書能順利完成。
前言
三年前,CSDN 推出了一個產品——ink,旨在提供一個高品質寫作環境。那時,我想寫一系列關於設計模式的文章,於是就在ink 裡開始寫作,陸陸續續寫了三篇文章,後來不知道什麼原因這個產品下架了,我的三篇文章也沒了,這事也就一直被我擱置下來。直到2017 年,知識付費盛行,各類付費的社區、產品如雨後春筍般崛起,而技術類的付費閱讀產品更是大行其道(GitChat 便是其中一種)。在GitChat 的盛情邀請之下,我寫作設計模式這一系列文章的想法又重新被點燃。2017 年年底,我開始在GitChat 上寫「從生活中領悟設計模式(Python)」課...
目錄
前言
第一篇 基礎篇
第0 章 啟程之前,請不要錯過我
0.1 Python 精簡入門
0.2 UML 精簡概述
第1 章 監聽模式(Observer Pattern)
1.1 從生活中領悟監聽模式
1.2 從劇情中思考監聽模式
1.3 監聽模式的模型抽象
1.4 實戰應用
1.5 應用場景
第2 章 狀態模式(State Pattern)
2.1 從生活中領悟狀態模式
2.2 從劇情中思考狀態模式
2.3 狀態模式的模型抽象
2.4 應用場景
第3 章 仲介模式(Mediator Pattern)
3.1 從生活中領悟仲介模式
3.2 從劇情中思考仲介模式
3.3 仲介模式的模型抽象
3.4 實戰應用
3.5 應用場景
第4 章 裝飾模式(Decorator Pattern)
4.1 從生活中領悟裝飾模式
4.2 從劇情中思考裝飾模式
4.3 裝飾模式的模型抽象
4.4 應用場景
第5 章 單例模式(Singleton Pattern)
5.1 從生活中領悟單例模式
5.2 從劇情中思考單例模式
5.3 單例模式的模型抽象
5.4 應用場景
第6 章 克隆模式(Clone Pattern)
6.1 從生活中領悟克隆模式
6.2 從劇情中思考克隆模式
6.3 克隆模式的模型抽象
6.4 實戰應用
6.5 應用場景
第7 章 職責模式(Chain of Responsibility Pattern)
7.1 從生活中領悟職責模式
7.2 從劇情中思考職責模式
7.3 職責模式的模型抽象
7.4 應用場景
第8 章 代理模式(Proxy pattern)
8.1 從生活中領悟代理模式
8.2 從劇情中思考代理模式
8.3 代理模式的模型抽象
8.4 應用場景
第9 章 面板模式(Facade Pattern)
9.1 從生活中領悟面板模式
9.2 從劇情中思考面板模式
9.3 面板模式的模型抽象
9.4 實戰應用
9.5 應用場景
第10 章 反覆運算模式(Iterator Pattern)
10.1 從生活中領悟反覆運算模式
10.2 從劇情中思考反覆運算模式
10.3 反覆運算模式的模型抽象
10.4 應用場景
第11 章 組合模式(Composite Pattern)
11.1 從生活中領悟組合模式
11.2 從劇情中思考組合模式
11.3 組合模式的模型抽象
11.4 實戰應用
11.5 應用場景
第12 章 構建模式(Builder Pattern)
12.1 從生活中領悟構建模式
12.2 從劇情中思考構建模式
12.3 構建模式的模型抽象
12.4 應用場景
第13 章 適配模式(Wrapper Pattern)
13.1 從生活中領悟適配模式
13.2 從劇情中思考適配模式
13.3 適配模式的模型抽象
13.4 實戰應用
13.5 應用場景
第14 章 策略模式(Strategy Pattern)
14.1 從生活中領悟策略模式
14.2 從劇情中思考策略模式
14.3 策略模式的模型抽象
14.4 實戰應用
14.5 應用場景
第15 章 工廠模式(Factory Pattern)
15.1 從生活中領悟工廠模式
15.2 從劇情中思考工廠模式
15.3 工廠三姐妹
15.4 進一步思考
15.5 實戰應用
第16 章 命令模式(Command Pattern)
16.1 從生活中領悟命令模式
16.2 從劇情中思考命令模式
16.3 命令模式的模型抽象
16.4 實戰應用
16.5 應用場景
第17 章 備忘模式(Memento Pattern)
17.1 從生活中領悟備忘模式
17.2 從劇情中思考備忘模式
17.3 備忘模式的模型抽象
17.4 實戰應用
17.5 應用場景
第18 章 享元模式(Flyweight Pattern)
18.1 從生活中領悟享元模式
18.2 從劇情中思考享元模式
18.3 享元模式的模型抽象
18.4 應用場景
第19 章 訪問模式(Visitor Pattern)
19.1 從生活中領悟訪問模式
19.2 從劇情中思考訪問模式
19.3 訪問模式的模型抽象
19.4 實戰應用
19.5 應用場景
第20 章 其他經典設計模式
20.1 範本模式(Template Method Pattern)
20.2 橋接模式(Bridge Pattern)
20.3 解釋模式(Interpreter Pattern)
第二篇 進階篇
第21 章 深入解讀篩檢程式模式
21.1 從生活中領悟篩檢程式模式
21.2 從劇情中思考篩檢程式模式
21.3 篩檢程式模式的模型抽象
21.4 實戰應用
21.5 應用場景
第22 章 深入解讀物件集區技術
22.1 從生活中領悟物件集區技術
22.2 從劇情中思考物件集區機制
22.3 物件集區機制的模型抽象
22.4 應用場景
第23 章 深入解讀回檔機制
23.1 從生活中領悟回檔機制
23.2 從劇情中思考回檔機制
23.3 回檔機制的模型抽象
23.4 實戰應用
23.5 應用場景
第24 章 深入解讀MVC 模式
24.1 從生活中領悟MVC 模式
24.2 從劇情中思考MVC 模式
24.3 MVC 模式的模型抽象
24.4 應用場景
第三篇 經驗篇
第25 章 關於設計模式的理解
25.1 眾多書籍之下為何還要寫此書
25.2 設計模式玄嗎
25.3 如何區分不同的模式
25.4 程式設計思維的三重境界
第26 章 關於設計原則的思考
26.1 SOLID 原則
26.2 是否一定要遵循這些設計原則
26.3 更為實用的設計原則
第27 章 關於專案重構的思考
27.1 什麼叫重構
27.2 為何要重構
27.3 什麼時機進行重構
27.4 如何重構程式碼
27.5 程式碼整潔之道
附錄A 23 種經典設計模式的索引對照表
附錄B Python 中_new_、_init_ 和_call_ 的用法
附錄 C Python 中metaclass 的原理
前言
第一篇 基礎篇
第0 章 啟程之前,請不要錯過我
0.1 Python 精簡入門
0.2 UML 精簡概述
第1 章 監聽模式(Observer Pattern)
1.1 從生活中領悟監聽模式
1.2 從劇情中思考監聽模式
1.3 監聽模式的模型抽象
1.4 實戰應用
1.5 應用場景
第2 章 狀態模式(State Pattern)
2.1 從生活中領悟狀態模式
2.2 從劇情中思考狀態模式
2.3 狀態模式的模型抽象
2.4 應用場景
第3 章 仲介模式(Mediator Pattern)
3.1 從生活中領悟仲介模式
3.2 從劇情中思考仲介模式
3.3 仲介模式的模型抽象
3.4 實戰應用
3.5 應用場景
...