【設(shè)計模式自習(xí)室】開篇:為什么要有設(shè)計模式?

前言

《設(shè)計模式自習(xí)室》系列,顧名思義,本系列文章帶你溫習(xí)常見的設(shè)計模式。

但是,在開篇中,我想要先整體的介紹下設(shè)計模式,讓大家知道為什么要學(xué)習(xí)設(shè)計模式。

所以這篇文章的主要內(nèi)容是:

  • 我對設(shè)計模式的理解
  • 設(shè)計模式的至高目標:解耦(高內(nèi)聚低耦合)
  • 設(shè)計模式的分類
  • 設(shè)計模式遵循的設(shè)計原則
  • 為什么我寫代碼常常用不到設(shè)計模式?

為什么我們需要設(shè)計模式?

我對設(shè)計模式的理解

當我剛剛接觸程序,最初聽到“設(shè)計模式”這四個字的時候,我常常會思考一個問題,這個東西為什么這么拗口。就像我當初聽到“離散數(shù)學(xué)”,“具體數(shù)學(xué)”一樣,有種摸不著頭腦的感覺。

帶著這種疑問,我嘗試看了幾篇介紹設(shè)計模式的文章,它們都對設(shè)計模式進行了這樣的介紹:

軟件設(shè)計模式(Design pattern),又稱設(shè)計模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。 使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。

看完之后,我更加摸不著頭腦了。看著什么單例模式,責(zé)任鏈模式的代碼,感覺老師從來就沒提過這些,為什么要把代碼寫成這樣,好好的寫完自己想要的功能不就好了嘛???

是的,設(shè)計模式,對于入門程序員來說,確實有點空中樓閣,尤其是對于沒接觸過大型項目的人而言,這些代碼是如此的陌生,甚至有點“故弄玄虛”。

但是,生活往往就是有這么多“但是”!當你逐漸入門了程序編寫,接觸到了大型的,功能復(fù)雜的,需要多人合作的代碼后,再回頭看設(shè)計模式,往往就有了越來越清晰的認識。

隨著我的經(jīng)驗積累,再回來復(fù)習(xí)設(shè)計模式,常常有醒悟的感覺。接下來就說說我對設(shè)計模式的認知:

設(shè)計模式的英文是什么?Design pattern,這是一個非常之準確的詞匯,個人認為比中文翻譯好太多了。

Patten中文釋義:. n. 模式;圖案;樣品. vt. 模仿

pattern往往意味著是一種既定的準則,從它的動詞可以看到,他有模仿的意思,也就是說,這樣的代碼設(shè)計,是一系列前人留下的經(jīng)驗,只要跟著這樣寫代碼,往往能夠讓你的代碼,更加簡潔,更加健壯,更加優(yōu)雅!

我覺得他應(yīng)該有個意譯的名字,叫做:代碼設(shè)計的最佳實踐!

是不是很耳熟,還記得最近很火的《阿里巴巴Java開發(fā)手冊》,以及經(jīng)典的《Effective Java》嗎?他們都是屬于經(jīng)驗總結(jié)型的知識,目的是幫助程序員寫出更優(yōu)雅的代碼!

如果你沒聽過上面的幾本書,沒關(guān)系,當然,你也可以看看我之前的文章 《阿里巴巴Java開發(fā)手冊》閱讀筆記,大概了解下他們的內(nèi)容是什么樣的,你就會理解我說的“他們是一個類型的”。

高內(nèi)聚低耦合

設(shè)計模式是一種代碼設(shè)計思路,其最最本質(zhì)的目的是為了解耦,延伸一點的話,還有為了可擴展性和健壯性,但是這都是建立在解耦的基礎(chǔ)之上。

有同學(xué)要問了,“解耦”是什么意思呢?請先看下面兩個概念:

高內(nèi)聚

系統(tǒng)中A、B兩個模塊進行交互,如果修改了A模塊,不影響模塊B的工作,那么認為A是高度內(nèi)聚的。

image

低耦合

那么當B發(fā)生改變時,A模塊仍然可以正常工作,那么就認為A與B是低耦合的。

image

所以解耦,本質(zhì)上就是讓不同的代碼塊各司其職,互不干擾!

設(shè)計模式的分類

創(chuàng)建型模式

創(chuàng)建型模式將創(chuàng)建對象的過程進行了抽象,也可以理解為將創(chuàng)建對象的過程進行了封裝,作為客戶程序僅僅需要去使用對象,而不再關(guān)系創(chuàng)建對象過程中的邏輯。

  • 簡單工廠模式(Simple Factory):簡單工廠模式不是GoF總結(jié)出來的23種設(shè)計模式之一
  • 工廠方法模式(Factory Method)
  • 抽象工廠模式(Abstract Factory)
  • 創(chuàng)建者模式(Builder)
  • 原型模式(Prototype)
  • 單例模式(Singleton)

結(jié)構(gòu)型模式

結(jié)構(gòu)型模式是為解決怎樣組裝現(xiàn)有的類,設(shè)計它們的交互方式。例如:擴展性(外觀、組成、代理、裝飾)、封裝(適配器、橋接)。因為如何設(shè)計對象的結(jié)構(gòu)、繼承和依賴關(guān)系會影響到后續(xù)程序的維護性、代碼的健壯性、耦合性等。

  • 外觀模式/門面模式(Facade門面模式)
  • 適配器模式(Adapter)
  • 代理模式(Proxy)
  • 裝飾模式(Decorator)
  • 橋梁模式/橋接模式(Bridge)
  • 組合模式(Composite)
  • 享元模式(Flyweight)

行為型模式

行為模式刻劃了在程序運行時難以跟蹤的復(fù)雜的控制流,進一步可分為行為類模式和行為對象模式。

  1. 行為類模式使用繼承機制在類間分派行為。

  2. 行為對象模式使用對象聚合來分配行為。一些行為對象模式描述了一組對等的對象怎樣相互協(xié)作以完成其中任何一個對象都無法單獨完成的任務(wù)。

  • 模板方法模式(Template Method)
  • 觀察者模式(Observer)
  • 狀態(tài)模式(State)
  • 策略模式(Strategy)
  • 職責(zé)鏈模式(Chain of Responsibility)
  • 命令模式(Command)
  • 訪問者模式(Visitor)
  • 調(diào)停者模式(Mediator)
  • 備忘錄模式(Memento)
  • 迭代器模式(Iterator)
  • 解釋器模式(Interpreter)

三者之間的區(qū)別和聯(lián)系

創(chuàng)建型模式提供生存環(huán)境,結(jié)構(gòu)型模式提供生存理由,行為型模式提供如何生存。

創(chuàng)建型模式為其他兩種模式使用提供了環(huán)境。

結(jié)構(gòu)型模式側(cè)重于接口的使用,它做的一切工作都是對象或是類之間的交互,提供一個門。

行為型模式顧名思義,側(cè)重于具體行為,所以概念中才會出現(xiàn)職責(zé)分配和算法通信等內(nèi)容。

設(shè)計原則

設(shè)計模式是優(yōu)雅的代碼實現(xiàn),所以會講究標準的設(shè)計原則,常用的設(shè)計原則如下:

  • 開閉原則: 對擴展開放,對修改關(guān)閉
  • 里氏轉(zhuǎn)換原則: 子類繼承父類,單獨完全可以運行
  • 依賴倒轉(zhuǎn)原則: 引用一個對象,如果這個對象有底層類型,直接引用底層類型
  • 接口隔離原則: 每一個接口應(yīng)該是一種角色
  • 合成/聚合復(fù)用原則: 新的對象應(yīng)使用一些已有的對象,使之成為新對象的一部分
  • 迪米特原則: 一個對象應(yīng)對其他對象有盡可能少的了解

為什么我寫代碼常常用不到設(shè)計模式?

這一點,是我臨時加上的,因為我之前也有這樣的困惑。看了這么多設(shè)計模式,為什么我日常使用中根本就不會想到去用呢?我想給出幾點回答:

第一,我們?nèi)粘i_發(fā)中,經(jīng)常是使用框架在構(gòu)造大型的項目,框架已經(jīng)為我們考慮到了太多的設(shè)計,已經(jīng)讓我們開箱即用。所以我們常常只需要CRUD(增刪改查)。其實框架的源碼中,使用到了非常多的設(shè)計模式,這也是為什么很多大牛在推薦我們看某某框架的源碼前,常常建議我們先看設(shè)計模式。否則看源碼的時候,會非常的吃力,因為不知道為什么會這樣寫代碼

第二,設(shè)計模式的使用往往在你的編程經(jīng)驗積累到一定程度后,在遇到了大量的問題后,你會想著去進行合理的代碼結(jié)構(gòu)設(shè)計來解決一些常常會遇到的問題,這時候,你就會慢慢的想到使用設(shè)計模式了!所以不要急,你可以先不用強行往自己的項目上放設(shè)計模式,但一定要先了解各種設(shè)計模式

第三,如果你急著想要上手實踐設(shè)計模式,那么,做一個完全不依賴大型框架的項目吧,可以是一個工具類,可以是一個小功能腳本,只要不依賴那些復(fù)雜的框架,很快你就能發(fā)現(xiàn)你代碼中可以應(yīng)用設(shè)計模式的地方,別問我怎么知道的,快去自己造一個輪子吧!

總結(jié)

本文概括介紹了下設(shè)計模式到底是個什么東西,在接下來的文章中,我們會一個個設(shè)計模式來介紹,敬請期待!

參考

https://github.com/CyC2018/CS-Notes/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%20-%20%E7%94%9F%E6%88%90%E5%99%A8.md

https://github.com/jiayisheji/blog/issues/2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

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