[導(dǎo)讀]前幾天,我給大家介紹了算法和數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)知識。后來又有小伙伴私信問我:“小灰,你能不能也講一講設(shè)計模式的相關(guān)知識?”沒問題!對于程序員來說,設(shè)計模式也是必須要掌握的一項核心知識,我今天就來給大家重點(diǎn)講一講。編程的痛點(diǎn)那么,到底什么是設(shè)計模式呢?在介紹這個概念之前,我先問問大家,...
程序員小灰" data-alias="chengxuyuanxiaohui" data-signature="一群喜愛編程技術(shù)和算法的小倉鼠。" data-from="0">前幾天,我給大家介紹了算法和數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)知識。后來又有小伙伴私信問我:“小灰,你能不能也講一講設(shè)計模式的相關(guān)知識?”
沒問題!對于程序員來說,設(shè)計模式也是必須要掌握的一項核心知識,我今天就來給大家重點(diǎn)講一講。
編程的痛點(diǎn)
那么,到底什么是設(shè)計模式呢?
在介紹這個概念之前,我先問問大家,在你們的工作當(dāng)中,有沒有接手過“祖?zhèn)鞔a”?也就是老板讓你維護(hù)前一任程序員寫的老項目。
小灰自己做過10年的程序員,有過很多次這樣的經(jīng)歷。這些個祖?zhèn)鞔a,有相當(dāng)一部分壓根兒不知道寫的是什么,注釋非常少,結(jié)構(gòu)也很混亂,不敢修改也不敢刪除。
當(dāng)初寫下這些代碼的前任,要么已經(jīng)離職了,根本找不到人來問。
就算他還在職,能找到人,想問對方一點(diǎn)代碼的問題,也還得看對方的臉色。
這就是祖?zhèn)鞔a的痛苦。
設(shè)計模式是什么
我們該怎么辦呢?
許多前輩程序員經(jīng)過長期實(shí)踐,總結(jié)出了一系列的解決方案。這些解決方案可以提高代碼的可讀性,增加代碼的可重用性,保證代碼的可擴(kuò)展性。
這一系列解決方案,被人們稱為設(shè)計模式,它是面向?qū)ο缶幊坍?dāng)中的各種經(jīng)典套路。
設(shè)計模式是一種抽象的編程思想,并不局限于某一特定的編程語言,而是在許多語言之間相通的。比如在Java、C#、C 語言當(dāng)中,都可以使用到設(shè)計模式。
但設(shè)計模式也有它的邊界,它的適用范圍是面向?qū)ο蟮木幊陶Z言。對于面向過程語言、函數(shù)式編程語言,談?wù)撛O(shè)計模式是沒有意義的。
如果有人跟你說,F(xiàn)ortran語言當(dāng)中的設(shè)計模式非常好用,或者說自己在學(xué)習(xí)Lisp語言當(dāng)中的設(shè)計模式,這人一定是一個假程序員。
設(shè)計模式的分類
那么,程序員前輩們一共總結(jié)出了多少種設(shè)計模式呢?
在1995年,有四位編程界的大佬合著了一本書,書名叫做《Design Patterns: Elements of Reusable Object-Oriented Software》,翻譯過來就是《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》,書里面總共收錄了23種設(shè)計模式。
這本書是軟件研發(fā)領(lǐng)域重要的里程碑,合著此書的四位作者,被業(yè)內(nèi)稱為GoF(Gang of Four),因此這本書也被人稱為GoF設(shè)計模式。
這23種設(shè)計模式,又可以根據(jù)設(shè)計的目的,分為大大類型:
第一類:創(chuàng)建型模式
這一類設(shè)計模式的目的是用于創(chuàng)建對象。比如大家常用的工廠模式、單例模式,就屬于創(chuàng)建型模式。
第二類:結(jié)構(gòu)型模式
這一類設(shè)計模式的目的是優(yōu)化不同類、對象、接口之間的結(jié)構(gòu)關(guān)系。比較常用的代理模式、裝飾者模式,就屬于結(jié)構(gòu)型模式。
第三類:行為型模式
這一類設(shè)計模式的目的是更好地實(shí)現(xiàn)類與類之間的交互以及算法的執(zhí)行。比如策略模式、觀察者模式,就屬于行為型模式。
下面這張圖,總結(jié)了所有23種設(shè)計模式的分類,大家可以收藏一下。
可能有的人會覺得疑惑:網(wǎng)上有很多程序員總是說到24種設(shè)計模式,你這里怎么只說了23種呢?
其實(shí),這兩種說法都沒錯,24種設(shè)計模式是在原有23種的基礎(chǔ)上,補(bǔ)充了一個空對象模式,它屬于行為型模式。
此外,隨著編程領(lǐng)域的不斷發(fā)展,有很多新的設(shè)計模式不斷被人提出來,目前人們所用到的設(shè)計模式其實(shí)遠(yuǎn)遠(yuǎn)不止24種。
比如生產(chǎn)者消費(fèi)者模式,發(fā)布訂閱模式等等,他們都不在24種設(shè)計模式當(dāng)中,但仍然非常常用。
可能有些做后臺開發(fā)的朋友會問了:我們平時用到的MVC模式,是不是也屬于設(shè)計模式呢?
以我個人的觀點(diǎn),設(shè)計模式所研究的是類與對象、接口之間的關(guān)系,解決的是某一個特定問題。
而MVC,研究的是代碼模塊之間的關(guān)系,并且提供的是一攬子解決方案。所以MVC屬于一種架構(gòu),而不是設(shè)計模式。
如何學(xué)習(xí)設(shè)計模式
那么,我們怎么才能學(xué)好設(shè)計模式呢?
就像學(xué)習(xí)算法和數(shù)據(jù)結(jié)構(gòu)一樣,我們可以通過看書、看網(wǎng)上的視頻課程,來了解各種設(shè)計模式的思想和實(shí)現(xiàn)。
入門級別的書,比較推薦程杰老師的《大話設(shè)計模式》。
進(jìn)階級別的書,推薦看看《Head First 設(shè)計模式》這本書。
課程的話,推薦極客時間王爭老師的《設(shè)計模式之美》,同時在B站上也有一些比較優(yōu)質(zhì)的設(shè)計模式課程,我會把課程鏈接發(fā)到本視頻的置頂回復(fù)當(dāng)中。
與此同時,大家也可以多看看一些經(jīng)典框架的源碼,里面也采用了很多的設(shè)計模式。比如Java程序員常用的Spring框架,里面就使用了工廠模式、代理模式、單例模式、適配器模式等等。
這樣既能熟悉框架的原理,也能加深對設(shè)計模式的理解,可謂是一舉兩得。
大家都是通過哪些途徑學(xué)習(xí)的設(shè)計模式?歡迎寫在留言區(qū)。
好了,關(guān)于設(shè)計模式的基本概念,我就給大家介紹到這里。以下是小灰曾經(jīng)分享過的設(shè)計模式相關(guān)漫畫,沒看過的小伙伴可以看一看:
裝飾器模式
職責(zé)鏈模式
工廠模式
建造者模式
原型模式
代理模式
外觀模式
觀察者模式
此外,最近小灰嘗試走出舒適區(qū),入駐B站開始錄制程序員相關(guān)的視頻。歡迎大家關(guān)注小灰的B站號【我是程序員小灰】,給個一鍵三連,感謝支持哦~~
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
一般從事互聯(lián)網(wǎng)工作,尤其是軟件類崗位,通常加班現(xiàn)象都是比較嚴(yán)重的。那么,做硬件的就沒有加班了嗎?
關(guān)鍵字:
互聯(lián)網(wǎng)
程序員
工程師
在大多數(shù)人眼里,程序員是一份高薪職業(yè),即便是剛畢業(yè)出來找工作的應(yīng)屆生,似乎也能隨隨便便月收入過萬。那么,事實(shí)真是如此嗎?
關(guān)鍵字:
程序員
計算機(jī)
在現(xiàn)在這個網(wǎng)絡(luò)時代,程序員在日益辛苦地工作,他們總是喜歡學(xué)習(xí)、嘗試新事物,求知欲望相當(dāng)強(qiáng),以最低調(diào)、踏實(shí)、核心的功能模塊搭建起這個科技世界。那么,本期的老黃歷就帶大家一起來看看關(guān)于1024程序員節(jié)的由來。
關(guān)鍵字:
1024
程序員
科技世界
(全球TMT2022年8月15日訊)為全面和深入地了解中國開發(fā)者群體整體現(xiàn)狀、應(yīng)用開發(fā)技術(shù)以及開發(fā)工具、平臺的狀況和發(fā)展趨勢,CSDN發(fā)布《2021-2022 中國開發(fā)者調(diào)查報告》,調(diào)研萬名開發(fā)者,圍繞開源開發(fā)者畫像、...
關(guān)鍵字:
開發(fā)者
BSP
操作系統(tǒng)
程序員
北京2022年5月17日 /美通社/ -- 程序員作為互聯(lián)網(wǎng)技術(shù)的關(guān)鍵支撐力量,是攜帶互聯(lián)網(wǎng)基因的靈魂人物?;ヂ?lián)網(wǎng)大廠程序員自帶高光,一度成為就業(yè)市場上的香餑餑。在疫情的影響和互聯(lián)網(wǎng)泡沫逐漸被稀釋的情況下,以大廠為代表的...
關(guān)鍵字:
程序員
通信
大數(shù)據(jù)
聯(lián)網(wǎng)技術(shù)
(全球TMT2022年5月17日訊)程序員作為互聯(lián)網(wǎng)技術(shù)的關(guān)鍵支撐力量,是攜帶互聯(lián)網(wǎng)基因的靈魂人物?;ヂ?lián)網(wǎng)大廠程序員自帶高光,一度成為就業(yè)市場上的香餑餑。在疫情的影響和互聯(lián)網(wǎng)泡沫逐漸被稀釋的情況下,以大廠為代表的互聯(lián)網(wǎng)...
關(guān)鍵字:
程序員
通信
大數(shù)據(jù)
聯(lián)網(wǎng)技術(shù)
上海2022年5月11日 /美通社/ --《中國居民膳食指南(2022)》顯示,目前我國超過半數(shù)成年居民存在超重或肥胖現(xiàn)象。996、加班、熬夜...在高強(qiáng)度工作的壓力下,如何避免"過勞肥&quo...
關(guān)鍵字:
網(wǎng)絡(luò)
HP
程序員
醫(yī)療服務(wù)
近一年,全球程序員的生存狀況如何?日前,美國科技公司數(shù)據(jù)收集網(wǎng)站Levels.fyi發(fā)布了《2021年全球程序員收入報告》,對互聯(lián)網(wǎng)各個級別的程序員薪酬進(jìn)行了統(tǒng)計分析。
關(guān)鍵字:
程序員
互聯(lián)網(wǎng)
2021年就快要結(jié)束了,小伙伴們都做過體檢了嗎?前一段時間,銀行的客戶經(jīng)理小姐姐幫小灰約了一次全方位的體檢。體檢報告一出來,小灰頓時瑟瑟發(fā)抖,居然有這么多項異常:其他異常倒還算不得嚴(yán)重,但是有兩項問題卻是十分危險的:一個...
關(guān)鍵字:
程序員
大家好,我是小林。最近很多讀者私信問我,我圖解文章中用到的畫圖工具、思維導(dǎo)圖工具、代碼貼圖工具是什么?我在很早的時候提到過,不過時間有點(diǎn)久了,而且比較零散,可能現(xiàn)在大部分讀者還不知道。我今天統(tǒng)一整理一下,我圖解文章用到的...
關(guān)鍵字:
程序員
GITHUB
CD
PS
“程序員能純靠技術(shù)渡過中年危機(jī)嗎?”▲截圖來源于知乎知乎上的這個提問,吸引了大批碼農(nóng)留言,熱贊均表示“能,很難”。因?yàn)殡y逃這兩種結(jié)局:???沒精力學(xué)習(xí),技術(shù)一迭代,被淘汰。???有技術(shù),90%公司不需要,年紀(jì)大了被淘汰。...
關(guān)鍵字:
程序員
計算機(jī)
LAN
TARGET
大家好,我是小林。最近,一些讀者朋友跟我抱怨,國內(nèi)競爭壓力大,想去外企,甚至國外試試機(jī)會,咨詢下我的建議。怎奈我也沒在國外呆過,沒有發(fā)言權(quán),但利弊肯定是有的,最起碼在國外離家人就遠(yuǎn)了,更何況近年的疫情,或多或少都不讓人放...
關(guān)鍵字:
程序員
“程序員能純靠技術(shù)渡過中年危機(jī)嗎?”▲截圖來源于知乎知乎上的這個提問,吸引了大批碼農(nóng)留言,熱贊均表示“能,很難”。因?yàn)殡y逃這兩種結(jié)局:???沒精力學(xué)習(xí),技術(shù)一迭代,被淘汰。???有技術(shù),90%公司不需要,年紀(jì)大了被淘汰。...
關(guān)鍵字:
程序員
星標(biāo)「嵌入式大雜燴」,一起進(jìn)步!大家好,我是ZhengN。小時候用小霸王玩魂斗羅的時候,三條命就可以打通關(guān),感覺自己挺厲害的,因?yàn)榛甓妨_的關(guān)數(shù)還是很多,劇情也比較長。那么,問題來了。為什么魂斗羅只有128KB卻可以實(shí)現(xiàn)那...
關(guān)鍵字:
程序員
“程序員能純靠技術(shù)渡過中年危機(jī)嗎?”▲截圖來源于知乎知乎上的這個提問,吸引了大批碼農(nóng)留言,熱贊均表示“能,很難”。因?yàn)殡y逃這兩種結(jié)局:???沒精力學(xué)習(xí),技術(shù)一迭代,被淘汰。???有技術(shù),90%公司不需要,年紀(jì)大了被淘汰。...
關(guān)鍵字:
程序員
【0】哈哈哈哈在家寫代碼真的是這樣【1】高級程序員編程是不是這個感覺呢?【2】編程的第一法則選擇正確的工具【3】糟糕!推錯分支了【4】看一下實(shí)習(xí)生的代碼【5】掌握了一門特別實(shí)用的編程新技術(shù)時?【6】向同事展示新框架【7】...
關(guān)鍵字:
代碼
程序員
你從事編程有多少年了?薪資是否達(dá)到了期望值?近一年增長幅度如何?「大城床」vs「小城房」,你會如何抉擇?最常用/最討厭/最想嘗試的開發(fā)語言是什么?開源吞噬世界趨勢下,你是否參與到了開源之中?云原生燃爆云計算領(lǐng)域,你是如何...
關(guān)鍵字:
程序員