本文做者:黃小斜程序員
轉載請務必在文章開頭註明出處和做者。web
本系列文章主要圍繞程序員,特別是Java或者後端程序員必須掌握的一些技術和技能,這些文章都是結合我我的的編程學習經歷,總結和沉澱下來的方法論。做者目前在阿里作Java,忙裏偷閒分享一些技術文章,但願能讓更多人更容易地學習編程。面試
系列文章將會把一些技術學習方法、過程、要領與個人學習經驗相結合,更加淺顯易懂,而且我也會把我學習時用的資料,書籍和文章拿出來分享給你們,節省你個人時間。所謂授人以魚也要授人以漁,是本系列文章但願達到的目標。spring
一個熱愛分享的程序員,一個愛生活的斜槓青年。分享程序員編程學習乾貨和我的成長心得,期待你的關注,讓咱們一塊兒進步!編程
學習編程的朋友,想必對於設計模式這個詞並不陌生,至少你必定也據說過,若是你是作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設計模式》 《大話設計模式》