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

默認文件1583048739345.jpg

原創聲明

本文作者:黃小斜

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

系列文章介紹

本系列文章主要圍繞程序員,特別是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工程師,專注於分享程序員前沿技術乾貨和編程學習心得,期待你的關注,和我們一起進步!

文中所提到的推薦資源都可以免費領取,在我的公衆號後臺回覆“設計模式”即可領取對應的下載地址。[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wpKwp5JF-1583414128169)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== “點擊並拖拽以移動”)]​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章