天天看點

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

原創聲明

本文作者:黃小斜

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

系列文章介紹

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

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

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

本文思維導圖

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

什麼是設計模式

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

《大話設計模式》

視訊

這裡我整理了一些還算不錯的視訊資源分享給大家,具體請在公衆号【程式員黃小斜】内回複“設計模式”即可檢視

部落格

Java技術倉庫《Java程式員複習指南》

https://github.com/h2pl/Java-Tutorial

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

面試指南

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

在公衆号【Java技術江湖】回複“PDF”即可免費領取。

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

微信公衆号【程式員黃小斜】

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

文中所提到的推薦資源都可以免費領取,在我的公衆号背景回複“設計模式”即可領取對應的下載下傳位址。

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