1. 程式人生 > >做了好幾年的程式設計師,才發現自己天天都在用設計模式!

做了好幾年的程式設計師,才發現自己天天都在用設計模式!

![預設檔案1583048739345.jpg](https://img2020.cnblogs.com/blog/1092007/202003/1092007-20200305211741000-1598530264.jpg) ## 原創宣告 本文作者:黃小斜 轉載請務必在文章開頭註明出處和作者。 ## 系列文章介紹 本系列文章主要圍繞程式設計師,特別是Java或者後端程式設計師必須掌握的一些技術和技能,這些文章都是結合我個人的程式設計學習經歷,總結和沉澱下來的方法論。作者目前在阿里做Java,忙裡偷閒分享一些技術文章,希望能讓更多人更容易地學習程式設計。 系列文章將會把一些技術學習方法、過程、要領與我的學習經驗相結合,更加淺顯易懂,並且我也會把我學習時用的資料,書籍和文章拿出來分享給大家,節省你我的時間。所謂授人以魚也要授人以漁,是本系列文章希望達到的目標。 一個熱愛分享的程式設計師,一個愛生活的斜槓青年。分享程式設計師程式設計學習乾貨和個人成長心得,期待你的關注,讓我們一起進步! ## 本文思維導圖 ![在這裡插入圖片描述](https://img2020.cnblogs.com/blog/1092007/202003/1092007-20200305211746286-333943014.png) ## 什麼是設計模式 學習程式設計的朋友,想必對於設計模式這個詞並不陌生,至少你一定也聽說過,如果你是做Java的,那麼就更加需要了解設計模式了,為什麼這麼說呢,因為Java作為一門面向物件語言,很多程式碼都可以通過設計模式得到簡化、規範,提升編碼效率和可讀性。 > 按照百度百科的說法,軟體設計模式(Design pattern),又稱設計模式,是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性、程式的重用性。 也就是說,程式碼可複用性是設計模式的核心要義。 平時我們聽說過的設計模式有哪些呢,比如工廠模式,單例模式,代理模式,觀察者模式等等,這些設計模式不僅在面試經常問到,而且在Java生態中也得到了廣泛的應用,比如JDK裡就有很多單例、工廠模式的應用,spring框架基本上也都用到了這幾個設計模式,而Tomcat這種web應用容器,也是集設計模式之大成,對於觀察者模式的應用特別多。 ## 為什麼要學習設計模式 那麼,我們學習設計模式有什麼用呢,一來,是幫助你更好地在日常開發中使用到設計模式,二來,想要理解JDK、spring以及Tomcat的實現原理和原始碼,你就必須要掌握相關的設計模式,否則你連程式碼都看不懂,又哪裡談得上開發呢。 這一點我體會很深,在大公司裡,很多核心繫統的程式碼都寫得非常的高階大氣上檔次,對於設計模式的使用可以說是用到了極致,像是模板方法、策略模式、工廠模式等等適用於大型應用開發的一些設計模式,都會得到廣泛的應用。先看懂程式碼,再進行開發,這肯定是程式設計師的自我修養之一。 學習設計模式,短期利於面試,長期則可以應用於工作,看來對設計模式的學習,已經是刻不容緩了。 ## 新手上路 對於新手來說,設計模式完全是陌生的事物,一般常見的20多個設計模式,能夠記住它的名字和用法都已經很困難了,更不用說自己能不能懂得如何去使用了。 我剛學設計模式的時候,就是抱著一本書啃半天,看完了所有的設計模式,但是過幾天就忘得差不多了,面試的時候問我工廠模式,觀察者模式,還是支支吾吾半天答不上來,說白了就是沒有理解。 比如這個工廠模式,就分為簡單工廠,工廠模式,以及抽象工廠模式,每個模式的用法都不太一樣,當時就困擾了我很長一段時間。 如果你理解了它的內涵之後,就可以大概知道,簡單工廠就是用來生成單一例項的,而工廠模式是可以根據輸入輸出不同的例項,抽象工廠則是根據不同的工廠生成不同產品的例項。 我們學習設計模式的時候,往往書本上給的栗子和demo都比較不切合實際,有的例子是動物,有的例子是食物,這個時候,如果我們自己去寫一寫,替換成工作中的一些場景,或者是自己熟悉的場景,比如說蔡徐坤,奧利給等等,相信更有助於你的理解和記憶。 花一些時間,跟著《head first 設計模式》這本書,把書上的設計模式案例都實現一下,能夠跑得起來,要比你一遍一遍地看書來得靠譜多了。 ## 學習原始碼 很多朋友看到“原始碼”兩個字就望而卻步,就好像讓你玩遊戲你一百個答應,讓你拆開機箱看看哪塊電路板因為玩遊戲而嚴重發熱,你就完全提不起興趣。 學習設計模式,除了實戰以外,最好的方式就是去看一些原始碼,比如JDK的原始碼,Spring的原始碼,甚至是Tomcat的原始碼。 如果你自己啃不動,那也可以跟著一些書籍和部落格去啃,網上隨便一搜就是一大把,spring裡的xx設計模式、Tomcat裡常見的n種設計模式,JDK裡的20種設計模式等等,可能你平時都沒有注意,一看自己平時用的API里居然有這麼多設計模式,你就會覺得很有意思了。 舉個栗子,JDK裡的IO流,就使用了裝飾者模式,比如對於一個IO輸出流,它可能是位元組流,也可能是字元流,它還可以是帶緩衝的輸出流,而這些特性都是通過裝飾者模式實現的,IO流的例項可以不斷的被轉化成另一種流,只需要通過 “(裝飾物)IO流”這種寫法就可以不斷地進行包裝,就好像你買了一杯奶茶,可以往裡面加椰果,加波霸,加奶加糖一樣。 spring裡最常用的幾個設計模式就是單例模式,代理模式。大家都知道spring的IOC和AOP,spring本身提供一個bean容器,而每個bean其實都是單例的(同一個堆裡只有一個例項)這其實就是用了單例模式來實現的。 那麼,AOP用的是什麼設計模式呢,其實就是代理模式,AOP是通過動態代理來實現的,首先,AOP是作用於某些方法或者是某些類的,你可以把這些方法或者類當成一個切面,也就是被代理的物件,而我們希望在這個切面上新增的功能,就是代理物件,比如統一的登入管理,請求攔截,安全檢查等功能。如果你瞭解過動態代理,應該就會理解我的這個描述。 而對於Tomcat來說,設計模式就更多了,我們這裡只講一個觀察者模式,Tomcat的啟動是有一個生命週期(pipeline)的,你可以把這個生命週期當成一系列要執行的方法,而Tomcat的實現允許你監聽這些方法的呼叫,你可以在pipeline上面註冊自己的監聽器,每當pipeline執行到你監聽的方法時,它們就會通知你,然後你去執行相應的動作。 不得不說,設計模式在Java生態中的應用實在是太多了,當然,理解設計模式這件事於是需要你花一定時間的。 ## 結合工作 理解抽象的事物往往都是具有挑戰性的。學習設計模式,我們一般都是看書或者看教程,一般會有對一個模式的介紹,以及相應的程式碼,既然有程式碼實現,那就不能算是太抽象的東西,不過,這些樣例程式碼往往和我們開發工作中的實現相去甚遠,所以,我們學習設計模式的時候也往往會學了就忘,更無法應用到開發工作中。 在工作中,有一項神祕的技能,可以讓你的程式碼能力突飛猛進,讓你的程式碼質量、規範,以及可複用程度大大提升,這項神祕的技能,其實就是CV,沒錯,就是複製貼上。 什麼?不就是抄程式碼嗎,我上我也行啊。不不不,程式設計師的事怎麼能叫抄呢,那叫學習!參考!複用! 不過,在大公司裡,CV這件事雖然可恥但是有用,畢竟大廠裡的大牛多,程式碼寫的好的人也多,每個團隊都有那麼些神仙程式碼,值得我們效仿學習,我就經常看到一些程式碼,是好幾年前的大牛寫的,被一直傳承到現在,有時候即使要做重構或者是做遷移,都要把這些大牛的核心程式碼繼續搬過來,可見這類優質程式碼的影響力之大。 我們先不管這些牛人的程式碼是怎麼寫出來的,但是這些優質的典範確實值得我們學習,比如我在開發一個系統的時候,發現裡面的核心業務程式碼都是通過模板方法+註解化配置的方式來進行開發的,於是從頭到尾看了一遍,十分佩服,覺得自己一定寫不出來,那麼這種程式碼風格就可以借鑑到另一個系統中。 比如最近我全程負責另一個系統的開發,我自己可以定義規範和風格,那麼我當然要大展身手了,於是,這些優質的程式碼模板和設計風格就都被我拿來參考了,畢竟,在大公司裡儘量不要重複造輪子,多借鑑多學習一定是沒有壞處的,等到你掌握了這些東西的核心之後,自己再去創造一套規範和風格也未嘗不可。 其實,不僅是設計模式,還有很多東西都是可以這樣通過模仿來學習的,比如架構的設計,系統的分析,技術棧的選擇等等,所謂書讀百遍其義自見,熟讀唐詩三百首,不會做詩也會吟,講究的就是一個“熟能生巧”吧。 ## 推薦資源 ### 書籍 《head first設計模式》 《大話設計