什麼是設計模式?程式設計師如何學好設計模式?

前幾天,我給大家介紹了演算法和資料結構的基礎知識。後來又有小夥伴私信問我:“小灰,你能不能也講一講設計模式的相關知識?”

沒問題!對於程式設計師來說,設計模式也是必須要掌握的一項核心知識,我今天就來給大家重點講一講。

程式設計的痛點

那麼,到底什麼是設計模式呢?

在介紹這個概念之前,我先問問大家,在你們的工作當中,有沒有接手過“祖傳程式碼”?也就是老闆讓你維護前一任程式設計師寫的老專案。

小灰自己做過10年的程式設計師,有過很多次這樣的經歷。這些個祖傳程式碼,有相當一部分壓根兒不知道寫的是什麼,註釋非常少,結構也很混亂,不敢修改也不敢刪除。

什麼是設計模式?程式設計師如何學好設計模式?

當初寫下這些程式碼的前任,要麼已經離職了,根本找不到人來問。

就算他還在職,能找到人,想問對方一點程式碼的問題,也還得看對方的臉色。

這就是祖傳程式碼的痛苦。

設計模式是什麼

我們該怎麼辦呢?

許多前輩程式設計師經過長期實踐,總結出了一系列的解決方案。這些解決方案可以提高程式碼的可讀性,增加程式碼的可重用性,保證程式碼的可擴充套件性。

這一系列解決方案,被人們稱為設計模式,它是面向物件程式設計當中的各種經典套路。

設計模式是一種抽象的程式設計思想,並不侷限於某一特定的程式語言,而是在許多語言之間相通的。比如在Java、C#、C++語言當中,都可以使用到設計模式。

但設計模式也有它的邊界,它的適用範圍是面向物件的程式語言。對於面向過程語言、函數語言程式設計語言,談論設計模式是沒有意義的。

如果有人跟你說,Fortran語言當中的設計模式非常好用,或者說自己在學習Lisp語言當中的設計模式,這人一定是一個假程式設計師。

什麼是設計模式?程式設計師如何學好設計模式?

設計模式的分類

那麼,程式設計師前輩們一共總結出了多少種設計模式呢?

在1995年,有四位程式設計界的大佬合著了一本書,書名叫做《Design Patterns: Elements of Reusable Object-Oriented Software》,翻譯過來就是《設計模式:可複用面向物件軟體的基礎》,書裡面總共收錄了23種設計模式。

這本書是軟體研發領域重要的里程碑,合著此書的四位作者,被業內稱為GoF(Gang of Four),因此這本書也被人稱為GoF設計模式。

這23種設計模式,又可以根據設計的目的,分為大大型別:

第一類:建立型模式

這一類設計模式的目的是用於建立物件。比如大家常用的工廠模式、單例模式,就屬於建立型模式。

第二類:結構型模式

這一類設計模式的目的是最佳化不同類、物件、介面之間的結構關係。比較常用的代理模式、裝飾者模式,就屬於結構型模式。

第三類:行為型模式

這一類設計模式的目的是更好地實現類與類之間的互動以及演算法的執行。比如策略模式、觀察者模式,就屬於行為型模式。

下面這張圖,總結了所有23種設計模式的分類,大家可以收藏一下。

什麼是設計模式?程式設計師如何學好設計模式?

可能有的人會覺得疑惑:網上有很多程式設計師總是說到24種設計模式,你這裡怎麼只說了23種呢?

其實,這兩種說法都沒錯,24種設計模式是在原有23種的基礎上,補充了一個

空物件模式

,它屬於行為型模式。

什麼是設計模式?程式設計師如何學好設計模式?

此外,隨著程式設計領域的不斷髮展,有很多新的設計模式不斷被人提出來,目前人們所用到的設計模式其實遠遠不止24種。

比如生產者消費者模式,釋出訂閱模式等等,他們都不在24種設計模式當中,但仍然非常常用。

可能有些做後臺開發的朋友會問了:我們平時用到的

MVC模式

,是不是也屬於設計模式呢?

什麼是設計模式?程式設計師如何學好設計模式?

以我個人的觀點,設計模式所研究的是類與物件、介面之間的關係,解決的是某一個特定問題。

而MVC,研究的是程式碼模組之間的關係,並且提供的是一攬子解決方案。所以

MVC屬於一種架構,而不是設計模式

如何學習設計模式

那麼,我們怎麼才能學好設計模式呢?

就像學習演算法和資料結構一樣,我們可以透過看書、看網上的影片課程,來了解各種設計模式的思想和實現。

入門級別的書,比較推薦程傑老師的

《大話設計模式》

進階級別的書,推薦看看

《Head First 設計模式》

這本書。

課程的話,推薦極客時間王爭老師的

《設計模式之美》

,同時在B站上也有一些比較優質的設計模式課程,我會把課程連結發到本影片的置頂回復當中。

與此同時,大家也可以多看看一些經典框架的原始碼,裡面也採用了很多的設計模式。比如Java程式設計師常用的

Spring框架

,裡面就使用了工廠模式、代理模式、單例模式、介面卡模式等等。

什麼是設計模式?程式設計師如何學好設計模式?

這樣既能熟悉框架的原理,也能加深對設計模式的理解,可謂是一舉兩得。

大家都是透過哪些途徑學習的設計模式?歡迎寫在留言區。

好了,關於設計模式的基本概念,我就給大家介紹到這裡。如果覺得這篇文章對你有幫助,希望可以點個贊,感謝支援!