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

a724888發表於2020-03-05

![預設檔案1583048739345.jpg](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NDQ3NjYwLTY2NDM5YzUyNTViMWJkMjUuanBn?x-oss-process=image/format,png)



## 原創宣告


本文作者:黃小斜


轉載請務必在文章開頭註明出處和作者。


## 系列文章介紹


本系列文章主要圍繞程式設計師,特別是Java或者後端程式設計師必須掌握的一些技術和技能,這些文章都是結合我個人的程式設計學習經歷,總結和沉澱下來的方法論。作者目前在阿里做Java,忙裡偷閒分享一些技術文章,希望能讓更多人更容易地學習程式設計。


系列文章將會把一些技術學習方法、過程、要領與我的學習經驗相結合,更加淺顯易懂,並且我也會把我學習時用的資料,書籍和文章拿出來分享給大家,節省你我的時間。所謂授人以魚也要授人以漁,是本系列文章希望達到的目標。


一個熱愛分享的程式設計師,一個愛生活的斜槓青年。分享程式設計師程式設計學習乾貨和個人成長心得,期待你的關注,讓我們一起進步!


## 本文思維導圖

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200305211619674.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E3MjQ4ODg=,size_16,color_FFFFFF,t_70)

## 什麼是設計模式

學習程式設計的朋友,想必對於設計模式這個詞並不陌生,至少你一定也聽說過,如果你是做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設計模式》

《大話設計模式》

##  推薦資源


### 書籍

《head first設計模式》

《大話設計模式》


### 影片

這裡我整理了一些還算不錯的影片資源分享給大家,具體請在公眾號【程式設計師黃小斜】內回覆“設計模式”即可檢視


### 部落格

Java技術倉庫《Java程式設計師複習指南》



整合全網優質Java學習內容,幫助你從基礎到進階系統化複習Java


### 面試指南

全網最熱的Java面試指南,共200多頁,非常實用,不管是用於複習還是準備面試都是不錯的。

在公眾號【Java技術江湖】回覆“PDF”即可免費領取。


對本系列文章有什麼建議和意見,也歡迎留言告訴我,期待你的回饋。


## 微信公眾號【程式設計師黃小斜】


致力於讓自學程式設計這件事變得更簡單,授人以魚也要授人以漁。作者自學程式設計轉行網際網路,目前是阿里巴巴Java工程師,專注於分享程式設計師前沿技術乾貨和程式設計學習心得,期待你的關注,和我們一起進步! 


**文中所提到的推薦資源都可以免費領取,在我的公眾號後臺回覆“設計模式”即可領取對應的下載地址。**


![](https://img-blog.csdnimg.cn/20200225215317641.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E3MjQ4ODg=,size_16,color_FFFFFF,t_70)![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== "點選並拖拽以移動")


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69906029/viewspace-2678751/,如需轉載,請註明出處,否則將追究法律責任。

相關文章