設計模式——C++版

開一個新坑……邊學習邊總結。如有錯漏,還望指摘。

什麼是設計模式?

設計模式,可以說是個老生常談的話題了,面試必問,考試必考,敲黑板,送分題。那麼什麼是設計模式呢?
百度一下:軟件設計模式(Design pattern),又稱設計模式,是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。
簡單說就是:前輩們在解決無數問題後總結出來的“三板斧”。這些設計模式可以解決絕大部分問題的同時,還可以保證代碼的可讀性、可靠性、重用性、易擴展性、可維護性等等。反正學就完事了嗷。

起源

爲了尊重一下前輩,這裏還是搬一下設計模式的歷史嗷:

1987年,肯特·貝克和沃德·坎寧安利用克里斯托佛·亞歷山大在建築設計領域裏的思想開發了設計模式,並把此思想應用在Smalltalk中的圖形用戶接口的生成中。
一年後Erich Gamma在他的蘇黎世大學博士畢業論文中開始嘗試把這種思想改寫爲適用於軟件開發。
1994 年, Erich Gamma畢業後與Richard Helm、Ralph Johnson 和 John Vlissides 三人合著出版了一本名爲 《Design Patterns - Elements of Reusable Object-Oriented Software》(中文譯名:《設計模式 - 可複用的面向對象軟件元素》) 的書,該書首次提到了軟件開發中設計模式的概念,並收錄了23個設計模式。

四位作者合稱 GOF(四人幫,全拼 Gang of Four)。他們所提出的設計模式主要是基於以下的面向對象設計原則。

  • 對接口編程而不是對實現編程。
  • 優先使用對象組合而不是繼承。

六大原則

設計模式爲了實現它的易擴展性、可維護性,主要遵循的中心思想就是這六大基本原則:

  1. 開閉原則
    該原則意思是:對擴展開放,對修改關閉。我的理解是,將來當模塊需要修改或者升級時,要儘可能做到,不修改現有的功能,而是進行擴展。這主要利用接口類和抽象類實現。當模塊進行修改時,只修改實現類或者增加新的接口而不改變原有接口,這樣可以最大程度減少對外界的影響,易於維護和升級。
  2. 里氏代換原則
    該原則是說,任何基類可以使用的地方,子類也一定可以使用。該原則是對實現抽象化的具體步驟的規範。我的理解是,子類是對基類的細化、擴充或者實現,而不是改變基類原有的功能或接口。基類是菜,子類就一定是菠菜、油麥菜、小白菜,不能是飛機、大炮。不然買菜的大媽就會一臉懵逼,滿臉問號。
  3. 依賴倒轉原則
    這個原則是開閉原則的基礎,具體內容是針對接口編程,依賴於抽象而不依賴於具體。我的理解是,當你使用某一個類時,儘可能的使用它的父類、接口類,而不是子類、實現類。這樣就可以儘可能的解耦合,當該類發生改變時,你受到的影響就會儘可能的小。
  4. 接口隔離原則
    這個原則的意思是:使用多個隔離的接口,比使用單個接口要好。它還有另外一個意思是:降低類之間的耦合度。這個原則我理解得不是很好,我覺得應該是說,一個接口的功能要儘可能的簡單,複雜的功能儘可能用多個簡單的接口完成,而不是用一個複雜的接口。
  5. 迪米特法則,又稱最少知道原則
    一個實體應當儘量少地與其他實體之間發生相互作用,使得系統功能模塊相對獨立。每一個模塊要儘可能減少對其他模塊的瞭解,這樣就能儘可能的減少對其他模塊的依賴。很好理解嘛,知道的越多越容易被滅口。
  6. 合成複用原則
    合成複用原則是指:儘量使用合成/聚合的方式,而不是使用繼承。這同樣是爲了隱藏實現細節。繼承會將部分細節暴露給子類,會使得子類和基類產生一定的耦合。

我翻開《設計模式》一看,這書沒有別的,歪歪斜斜的每頁上都寫着‘六大原則’四個字。我橫豎睡不着,仔細看了半夜,才從字縫裏看出字來,滿本都寫着三個字是“解耦合”!
——魯迅

開個玩笑,其實仔細看這六大原則,全是一箇中心思想:解耦合。降低模塊之間的耦合,以此降低模塊之間的互相影響,以此增加代碼的可維護性、可擴展性。

設計模式

這裏套用一個隨處可見的圖片(出處我沒有考證……):
在這裏插入圖片描述

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