前言
最近一段時間研究了一波設計模式相關的話題。理論結合實際的方式,將設計模式與實際項目相結合,獲益頗豐。
設計模式基本原理是比較簡單的,難的是如何將其運用到實際工作中去,且真的解決實際的問題,而不是爲了使用模式而使用設計模式
這個是需要工作經驗的積累、衆多項目的經歷,以及實際中遇到的痛點。儘管在當時可能不會解決,但是在研究設計模式的時候,一定要有:哦,之前遇到的問題,原來可以通過這個設計模式來解決。
這段時間關於設計模式的產出:
- 設計模式 ~ 面向對象 6 大設計原則剖析與實戰
- 設計模式 ~ 模板方法模式分析與實戰
- 設計模式 ~ 觀察者模式分析與實戰
- 設計模式 ~ 單例模式分析與實戰
- 設計模式 ~ 深入理解建造者模式與實戰
- 設計模式 ~ 工廠模式剖析與實戰
- 設計模式 ~ 適配器模式分析與實戰
- 設計模式 ~ 裝飾模式探究
- 設計模式 ~ 深入理解代理模式
爲什麼寫這個系列的文章?
寫這個設計模式系列相關的文章,主要有兩個原因:
-
市面上的博客主要是集中設計模式的基本概念
我覺得這是一種缺憾,很少有博客從實戰的角度去分析設計模式,所以希望通過實際項目結合設計模式的方式,談談我對面向對象的設計原則思考和見解,以及如何通過面向對象的設計原則以及設計模式去
codereView
和重構代碼
,希望對其他開發者有拋磚引玉的作用。在寫作的期間,有的時候1
個小時增長了40
多個粉絲,同時收到了許多的點贊和評論,也是激勵筆者持續學習和創作的動力。同時也有好幾篇設計模式文章被推薦到CSDN
首頁。 -
通過博客的方式,更加深入的研究設計模式
寫博客不僅僅把某種成果複述出來,而是反覆的咀嚼,反覆的思考,爲什麼是這樣的,爲什麼不是那樣,這也是一種覆盤和再次深度思考的過程,從而形成自己的經驗的。在寫作的過程中,自己的腦海中會冒出很多疑問,然後你會參考很多書籍和資料甚至是工作中的項目代碼。在研究設計模式的過程中也參考了很多書籍,如:
《設計模式之禪》
、《Java設計模式及實踐》
、《Java設計模式深入研究》
、《設計模式(Java版)》
、《Java與模式》
、《Head First 設計模式》
。你會驚奇的發現它們之間有很多是互相借鑑的,很多講解基本一模一樣。但是他們也有自己的優點,也學到了很多,在閱讀這些書籍的時候,有的時候靈光乍現,以前的某段代碼是可以通過這個這個設計原則或設計模式來更好的組織的,所以人的大腦是很奇怪的。整個寫作過程是在不斷的思考、覆盤,然後形成自己的見解,最終形成屬於自己的經驗
歷程
研究設計模式的過程中主要經歷以下幾個階段:
-
基本概念
針對每個模式,首先要搞清楚它的基本概念,
類圖
是什麼樣的,它有哪些角色
組成的,主要是解決哪些問題
的,這個設計模式有什麼不足,然後寫一個最簡易的代碼來實現一個這樣的模式,從代碼的層面感受下模式是什麼樣子的。
然後參考其他書籍是怎麼介紹這個模式的,它們講解有什麼不同,因爲每本書的作者項目經驗不同,經歷也不同,所以需要去看下它們有哪些是可以我們學習的。這是閱讀方法中的主題閱讀方法,就是研究某一主題,我們需要參考很多的書籍關於該主題的論述。 -
使用
使用設計模式包括在項目中使用,也包括一些源碼如
JDK
,或使用比較廣泛的開源框架等,看看他們是怎麼使用這個設計模式的,這樣使用有什麼好處?經過這些思考,幫助我們更好在實際開發中使用它。
對現在正在做的項目進行CodeReview
看看哪些地方可以改了,或者以前做過程中遇到哪些代碼不好維護的痛點,看看哪些可以使用面向對象原則或設計模式進行改造。 -
沉澱
在閱讀源碼的時候,裏面的設計模式可能不是和我們學習設計模式基本概念的時候一模一樣的,有些是經過修改或根據框架需求來改造的,我們要知道爲什麼要這麼做,而不是機械的照着設計模式
UML
圖來實現。
在實際項目中使用設計模式或者設計原則的時候,一定要不斷的反思,使用這個設計模式或面向對象設計原則,是不是代碼更好維護,是不是違反其他設計原則、對工作量的影響有多大等等,經過這些靈魂發問,會慢慢形成屬於自己的對設計模式設計原則的見解。也就是說使用它一定要有理論支撐
,而不是靠感覺。
最後
當然還有很多設計模式沒有分析,只介紹了一些常用的設計模式,設計模式以及面向對象的設計原則自己掌握的遠遠不夠,這個需要經過項目洗禮,以及對設計模式和麪向對象設計原則的應用和理解。
研究設計模式及面向對象的程序設計是貫穿整個程序員的職業生涯。所以今後會根據自己對設計模式的理解和使用,會持續更新已經寫好的關於設計模式的文章,或者新寫還沒有分析到的文章,所以在這裏只做一個小結。
如果你在設計模式和程序設計原則方面有自己的見解或者使用經驗歡迎留言交流 ~
如果你覺得本文幫助到你,給我個關注和讚唄!
另外本文涉及到的代碼都在我的 AndroidAll GitHub 倉庫中。該倉庫除了 設計模式
,還有 Android 程序員需要掌握的技術棧,如:程序架構、設計模式、性能優化、數據結構算法、Kotlin、Flutter、NDK,以及常用開源框架 Router、RxJava、Glide、LeakCanary、Dagger2、Retrofit、OkHttp、ButterKnife、Router 的原理分析 等,持續更新,歡迎 star。