做了好幾年的程序員,才發(fā)現(xiàn)自己天天都在用設(shè)計模式途事!

默認(rèn)文件1583048739345.jpg

原創(chuàng)聲明

本文作者:黃小斜

轉(zhuǎn)載請務(wù)必在文章開頭注明出處和作者验懊。

系列文章介紹

本系列文章主要圍繞程序員,特別是Java或者后端程序員必須掌握的一些技術(shù)和技能尸变,這些文章都是結(jié)合我個人的編程學(xué)習(xí)經(jīng)歷义图,總結(jié)和沉淀下來的方法論。作者目前在阿里做Java振惰,忙里偷閑分享一些技術(shù)文章歌溉,希望能讓更多人更容易地學(xué)習(xí)編程。

系列文章將會把一些技術(shù)學(xué)習(xí)方法骑晶、過程痛垛、要領(lǐng)與我的學(xué)習(xí)經(jīng)驗相結(jié)合,更加淺顯易懂桶蛔,并且我也會把我學(xué)習(xí)時用的資料匙头,書籍和文章拿出來分享給大家,節(jié)省你我的時間仔雷。所謂授人以魚也要授人以漁蹂析,是本系列文章希望達(dá)到的目標(biāo)。

一個熱愛分享的程序員碟婆,一個愛生活的斜杠青年电抚。分享程序員編程學(xué)習(xí)干貨和個人成長心得,期待你的關(guān)注竖共,讓我們一起進(jìn)步蝙叛!

本文思維導(dǎo)圖

在這里插入圖片描述

什么是設(shè)計模式

學(xué)習(xí)編程的朋友,想必對于設(shè)計模式這個詞并不陌生公给,至少你一定也聽說過借帘,如果你是做Java的蜘渣,那么就更加需要了解設(shè)計模式了,為什么這么說呢肺然,因為Java作為一門面向?qū)ο笳Z言蔫缸,很多代碼都可以通過設(shè)計模式得到簡化、規(guī)范际起,提升編碼效率和可讀性拾碌。

按照百度百科的說法,軟件設(shè)計模式(Design pattern)街望,又稱設(shè)計模式倦沧,是一套被反復(fù)使用、多數(shù)人知曉的它匕、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)窖认。使用設(shè)計模式是為了可重用代碼豫柬、讓代碼更容易被他人理解、保證代碼可靠性扑浸、程序的重用性烧给。

也就是說,代碼可復(fù)用性是設(shè)計模式的核心要義喝噪。

平時我們聽說過的設(shè)計模式有哪些呢础嫡,比如工廠模式,單例模式酝惧,代理模式榴鼎,觀察者模式等等,這些設(shè)計模式不僅在面試經(jīng)常問到晚唇,而且在Java生態(tài)中也得到了廣泛的應(yīng)用巫财,比如JDK里就有很多單例、工廠模式的應(yīng)用哩陕,spring框架基本上也都用到了這幾個設(shè)計模式平项,而Tomcat這種web應(yīng)用容器,也是集設(shè)計模式之大成悍及,對于觀察者模式的應(yīng)用特別多闽瓢。

為什么要學(xué)習(xí)設(shè)計模式

那么,我們學(xué)習(xí)設(shè)計模式有什么用呢心赶,一來扣讼,是幫助你更好地在日常開發(fā)中使用到設(shè)計模式,二來园担,想要理解JDK届谈、spring以及Tomcat的實現(xiàn)原理和源碼枯夜,你就必須要掌握相關(guān)的設(shè)計模式,否則你連代碼都看不懂艰山,又哪里談得上開發(fā)呢湖雹。

這一點我體會很深,在大公司里曙搬,很多核心系統(tǒng)的代碼都寫得非常的高端大氣上檔次摔吏,對于設(shè)計模式的使用可以說是用到了極致,像是模板方法纵装、策略模式征讲、工廠模式等等適用于大型應(yīng)用開發(fā)的一些設(shè)計模式,都會得到廣泛的應(yīng)用橡娄。先看懂代碼诗箍,再進(jìn)行開發(fā),這肯定是程序員的自我修養(yǎng)之一挽唉。

學(xué)習(xí)設(shè)計模式滤祖,短期利于面試,長期則可以應(yīng)用于工作瓶籽,看來對設(shè)計模式的學(xué)習(xí)匠童,已經(jīng)是刻不容緩了。

新手上路

對于新手來說塑顺,設(shè)計模式完全是陌生的事物汤求,一般常見的20多個設(shè)計模式,能夠記住它的名字和用法都已經(jīng)很困難了严拒,更不用說自己能不能懂得如何去使用了扬绪。

我剛學(xué)設(shè)計模式的時候,就是抱著一本書啃半天裤唠,看完了所有的設(shè)計模式勒奇,但是過幾天就忘得差不多了,面試的時候問我工廠模式巧骚,觀察者模式赊颠,還是支支吾吾半天答不上來,說白了就是沒有理解劈彪。

比如這個工廠模式竣蹦,就分為簡單工廠,工廠模式沧奴,以及抽象工廠模式痘括,每個模式的用法都不太一樣,當(dāng)時就困擾了我很長一段時間。

如果你理解了它的內(nèi)涵之后纲菌,就可以大概知道挠日,簡單工廠就是用來生成單一實例的,而工廠模式是可以根據(jù)輸入輸出不同的實例翰舌,抽象工廠則是根據(jù)不同的工廠生成不同產(chǎn)品的實例嚣潜。

我們學(xué)習(xí)設(shè)計模式的時候,往往書本上給的栗子和demo都比較不切合實際椅贱,有的例子是動物懂算,有的例子是食物,這個時候庇麦,如果我們自己去寫一寫计技,替換成工作中的一些場景,或者是自己熟悉的場景山橄,比如說蔡徐坤垮媒,奧利給等等,相信更有助于你的理解和記憶航棱。

花一些時間涣澡,跟著《head first 設(shè)計模式》這本書,把書上的設(shè)計模式案例都實現(xiàn)一下丧诺,能夠跑得起來,要比你一遍一遍地看書來得靠譜多了奄薇。

學(xué)習(xí)源碼

很多朋友看到“源碼”兩個字就望而卻步驳阎,就好像讓你玩游戲你一百個答應(yīng),讓你拆開機(jī)箱看看哪塊電路板因為玩游戲而嚴(yán)重發(fā)熱馁蒂,你就完全提不起興趣呵晚。

學(xué)習(xí)設(shè)計模式,除了實戰(zhàn)以外沫屡,最好的方式就是去看一些源碼饵隙,比如JDK的源碼,Spring的源碼沮脖,甚至是Tomcat的源碼金矛。

如果你自己啃不動,那也可以跟著一些書籍和博客去啃勺届,網(wǎng)上隨便一搜就是一大把驶俊,spring里的xx設(shè)計模式、Tomcat里常見的n種設(shè)計模式免姿,JDK里的20種設(shè)計模式等等饼酿,可能你平時都沒有注意,一看自己平時用的API里居然有這么多設(shè)計模式,你就會覺得很有意思了故俐。

舉個栗子想鹰,JDK里的IO流,就使用了裝飾者模式药版,比如對于一個IO輸出流辑舷,它可能是字節(jié)流,也可能是字符流刚陡,它還可以是帶緩沖的輸出流惩妇,而這些特性都是通過裝飾者模式實現(xiàn)的,IO流的實例可以不斷的被轉(zhuǎn)化成另一種流筐乳,只需要通過 “(裝飾物)IO流”這種寫法就可以不斷地進(jìn)行包裝歌殃,就好像你買了一杯奶茶,可以往里面加椰果蝙云,加波霸氓皱,加奶加糖一樣。

spring里最常用的幾個設(shè)計模式就是單例模式勃刨,代理模式波材。大家都知道spring的IOC和AOP,spring本身提供一個bean容器,而每個bean其實都是單例的(同一個堆里只有一個實例)這其實就是用了單例模式來實現(xiàn)的身隐。

那么廷区,AOP用的是什么設(shè)計模式呢,其實就是代理模式贾铝,AOP是通過動態(tài)代理來實現(xiàn)的隙轻,首先,AOP是作用于某些方法或者是某些類的垢揩,你可以把這些方法或者類當(dāng)成一個切面玖绿,也就是被代理的對象,而我們希望在這個切面上添加的功能叁巨,就是代理對象斑匪,比如統(tǒng)一的登錄管理,請求攔截锋勺,安全檢查等功能蚀瘸。如果你了解過動態(tài)代理,應(yīng)該就會理解我的這個描述庶橱。

而對于Tomcat來說苍姜,設(shè)計模式就更多了,我們這里只講一個觀察者模式悬包,Tomcat的啟動是有一個生命周期(pipeline)的衙猪,你可以把這個生命周期當(dāng)成一系列要執(zhí)行的方法,而Tomcat的實現(xiàn)允許你監(jiān)聽這些方法的調(diào)用,你可以在pipeline上面注冊自己的監(jiān)聽器垫释,每當(dāng)pipeline執(zhí)行到你監(jiān)聽的方法時丝格,它們就會通知你,然后你去執(zhí)行相應(yīng)的動作棵譬。

不得不說显蝌,設(shè)計模式在Java生態(tài)中的應(yīng)用實在是太多了,當(dāng)然订咸,理解設(shè)計模式這件事于是需要你花一定時間的曼尊。

結(jié)合工作

理解抽象的事物往往都是具有挑戰(zhàn)性的。學(xué)習(xí)設(shè)計模式脏嚷,我們一般都是看書或者看教程骆撇,一般會有對一個模式的介紹,以及相應(yīng)的代碼父叙,既然有代碼實現(xiàn)神郊,那就不能算是太抽象的東西,不過趾唱,這些樣例代碼往往和我們開發(fā)工作中的實現(xiàn)相去甚遠(yuǎn)涌乳,所以,我們學(xué)習(xí)設(shè)計模式的時候也往往會學(xué)了就忘甜癞,更無法應(yīng)用到開發(fā)工作中夕晓。

在工作中,有一項神秘的技能悠咱,可以讓你的代碼能力突飛猛進(jìn)蒸辆,讓你的代碼質(zhì)量、規(guī)范乔煞,以及可復(fù)用程度大大提升,這項神秘的技能柒室,其實就是CV渡贾,沒錯,就是復(fù)制粘貼雄右。

什么空骚?不就是抄代碼嗎,我上我也行啊擂仍。不不不囤屹,程序員的事怎么能叫抄呢,那叫學(xué)習(xí)逢渔!參考肋坚!復(fù)用!

不過,在大公司里智厌,CV這件事雖然可恥但是有用诲泌,畢竟大廠里的大牛多,代碼寫的好的人也多铣鹏,每個團(tuán)隊都有那么些神仙代碼敷扫,值得我們效仿學(xué)習(xí),我就經(jīng)吵闲叮看到一些代碼葵第,是好幾年前的大牛寫的,被一直傳承到現(xiàn)在合溺,有時候即使要做重構(gòu)或者是做遷移卒密,都要把這些大牛的核心代碼繼續(xù)搬過來,可見這類優(yōu)質(zhì)代碼的影響力之大辫愉。

我們先不管這些牛人的代碼是怎么寫出來的栅受,但是這些優(yōu)質(zhì)的典范確實值得我們學(xué)習(xí),比如我在開發(fā)一個系統(tǒng)的時候恭朗,發(fā)現(xiàn)里面的核心業(yè)務(wù)代碼都是通過模板方法+注解化配置的方式來進(jìn)行開發(fā)的屏镊,于是從頭到尾看了一遍,十分佩服痰腮,覺得自己一定寫不出來而芥,那么這種代碼風(fēng)格就可以借鑒到另一個系統(tǒng)中。

比如最近我全程負(fù)責(zé)另一個系統(tǒng)的開發(fā)膀值,我自己可以定義規(guī)范和風(fēng)格棍丐,那么我當(dāng)然要大展身手了,于是沧踏,這些優(yōu)質(zhì)的代碼模板和設(shè)計風(fēng)格就都被我拿來參考了歌逢,畢竟,在大公司里盡量不要重復(fù)造輪子翘狱,多借鑒多學(xué)習(xí)一定是沒有壞處的秘案,等到你掌握了這些東西的內(nèi)核之后,自己再去創(chuàng)造一套規(guī)范和風(fēng)格也未嘗不可潦匈。

其實阱高,不僅是設(shè)計模式,還有很多東西都是可以這樣通過模仿來學(xué)習(xí)的茬缩,比如架構(gòu)的設(shè)計赤惊,系統(tǒng)的分析,技術(shù)棧的選擇等等凰锡,所謂書讀百遍其義自見未舟,熟讀唐詩三百首圈暗,不會做詩也會吟,講究的就是一個“熟能生巧”吧处面。

推薦資源

書籍

《head first設(shè)計模式》
《大話設(shè)計模式》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厂置,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子魂角,更是在濱河造成了極大的恐慌昵济,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件野揪,死亡現(xiàn)場離奇詭異访忿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)斯稳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門海铆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挣惰,你說我怎么就攤上這事卧斟。” “怎么了憎茂?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵珍语,是天一觀的道長。 經(jīng)常有香客問我竖幔,道長板乙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任拳氢,我火速辦了婚禮募逞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馋评。我一直安慰自己放接,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布留特。 她就那樣靜靜地躺著纠脾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磕秤。 梳的紋絲不亂的頭發(fā)上乳乌,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天捧韵,我揣著相機(jī)與錄音市咆,去河邊找鬼。 笑死再来,一個胖子當(dāng)著我的面吹牛蒙兰,可吹牛的內(nèi)容都是我干的磷瘤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼搜变,長吁一口氣:“原來是場噩夢啊……” “哼采缚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挠他,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扳抽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后殖侵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贸呢,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年拢军,在試婚紗的時候發(fā)現(xiàn)自己被綠了楞陷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡茉唉,死狀恐怖固蛾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情度陆,我是刑警寧澤艾凯,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站坚芜,受9級特大地震影響览芳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸿竖,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一沧竟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缚忧,春花似錦悟泵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至球榆,卻和暖如春朽肥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背持钉。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工衡招, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人每强。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓始腾,卻偏偏與公主長得像州刽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浪箭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容