23種設計模式:現代C++實現 V2.0

CalmReason發表於2016-03-16

CSDN全面系統介紹23中設計模式的專欄



設計模式的一些基本原則:
  1. 單一職責原則
    1. 一個類只有一個職責,不應既做這又做那,這樣的好處是:

    2. 降低了類的複雜性

    3. 提高了程式碼的可讀性,可維護性

    4. 降低了因變更帶來的風險

  2. 里氏替換原則
    1. 一個子類必須實現父類的所有方法

    2. 一個子類可以擁有父類沒有的方法

    3. 在所有需要父類物件的地方都可以用子類的物件替換而不會出現問題

  3. 依賴倒置原則
    1. 高層模組不應該依賴底層模組

    2. 抽象不應該依賴於細節

    3. 實現應該依賴於抽象

    4. 面向介面程式設計
  4. 介面隔離原則
    1. 一個類可以有多個方法,但如果打算向外部提供部分方法,則把這些方法實現為介面,返回介面型別
  5. 迪米特法則
    1. 最少知識法則
    2. 只與你直接的朋友通訊
    3. 一個類不應該與過多的類發生聯絡
    4. 如果一個類需要呼叫第三個類的方法,可以加入中間者,轉發呼叫這個方法
  6. 開關原則
    1. 最重要的一個核心原則
    2. 一個軟體實體應該對擴充套件開放,對修改封閉
  7. 組合優先於繼承

  8. 把變與不變的事物分開

  9. 委託,委託,委託
  10. 你不會用到它 


目前隨著程式語言的進步,很多模式已經沒有存在的必要了!

設計模式是某種程度上類C++這種靜態語言在動態性方面的不足,隨著各種語言動態性的增強(C++的function+bind),很多模式已經沒有存在的必要了(參考陳碩的《Linux多執行緒服務端程式設計》)

全面介紹23種設計模式參考

1 建立型模式

抽象工廠Abstract Factory 1-1

意圖:用工廠類的不同成員函式來返回不同型別的物件。這樣一來使用者不必記住各個類的名字。

這個模式有個明顯的問題:新增新類要修改原來的程式碼!

工廠方法Factory Method 1-2

意圖:定義一個建立物件的介面,讓子類決定例項化哪一個類

這個模式就是想突破抽象工廠修改原始碼的問題。使用C++模板就可以輕鬆實現新型別的建立工作

抽象工廠與工廠方法可以被std::function+std::bind代替,所以不再需要大動干戈的設計工廠方法了,參考下面的連結:

抽象工廠與工廠方法:示例程式碼

另外std::make_pair  std::make_shared 均可以理解為工廠方法。

單利模式Singleton 1-5

意圖:保證一個類僅有一個例項,並提供一個全域性訪問點。

多執行緒的單利需要加鎖訪問instance()方法,關於加鎖的示例程式碼參考:多執行緒同步的開發

例子:Boost中的單利模式

2 結構型模式

介面卡模式Adapter 2-1

意圖:將一個類的介面轉換為客戶希望的另一個介面。

例子:用deque實現棧或者佇列

橋接模式Bridge 2-2

意圖:將抽象部分與實現部分分離,使它們都可以獨立的變化。(核心在抽象,為了應對變更才有了不同的實現)

例子:Windows各種視窗使用成員指標來指向具體的實現類

示例程式碼

組合模式Composite 2-3

意圖:將物件組合成樹形結構以表示“整體-部分”的層次結構,組合模式使得使用者對單個物件的使用和組合物件的使用具有一致性。

例子:表示式求值(一元運算表示式、二元運算表示式、葉子節點)

代理模式Proxy 2-7

意圖:為物件提供一種代理以控制對這個物件的訪問。(核心是被代理物件,通常是控制建立、初始化、釋放等)

例子:智慧指標,shared_ptr基本用法 weak_ptr基本用法

3 行為模式

觀察者模式Observer 3-7

意圖:定義物件間的一種一對多的關係,當一個物件的狀態發生改變時,所有依賴它的物件都得到通知並被自動更新。
例子:釋出訂閱

策略模式Strategy 3-9

意圖:定義一個系列演算法,把他們一個個封裝起來,並且使它們可互相替換。使得演算法可以獨立於使用它的客戶。

策略模式本質上等價於工廠方法模式。可以通過多型來實現隨意指定哪個演算法。將來增加了新的演算法,原來的程式正常執行。

例子:策略模式Strategy 





相關文章