DOING:設計模式及其 C++ 實現


總體介紹

我們知道了很多,語法上,算法上,數據結構上的知識,但是這些只是零散的。

當我們要開發一個項目的時候,上面的東西都要用到,類似於士兵,那麼我們需要統領他們,就需要有一個 將軍。那麼設計模式其實就是這個將軍的作用

一個模式描述了一個不斷髮生的問題以及這個問題的解決方案;(是一個總結成 類似 兵法的東西)。
設計模式是前人的設計經驗上總結出來的,對於一些普遍存在的問題提供的通用解決方案;比如說,單例模式,觀察者模式等等

常用的設計模式,這裏我們主要學習,面向對象的常見 23 種設計模式

image

具體所有介紹,也可以看這裏:https://www.runoob.com/design-pattern/design-pattern-tutorial.html


設計模式之單例模式(Singleton)

單例模式,就是我們只需要整個程序中,有且只有一個實例(其實就是,有一個東西,在所有進程中都有,而且是共用的)。不會說,一個進程就有一個實例。

單例模式(Singleton Pattern)是最簡單的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。

這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

注意

  • 1、單例類只能有一個實例
  • 2、單例類必須自己創建自己的唯一實例。
  • 3、單例類必須給所有其他對象提供這一實例。(也就是,其他對象,都共用這一個實例)

意圖: 保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。

主要解決: 一個全局使用的類頻繁地創建與銷燬。

何時使用: 當您想控制實例數目,節省系統資源的時候。

如何解決: 判斷系統是否已經有這個單例,如果有則返回,如果沒有則創建。

關鍵代碼: 構造函數是私有的。

應用實例:

  • 1、一個班級只有一個班主任。
  • 2、Windows 是多進程多線程的,在操作一個文件的時候,就不可避免地出現多個進程或線程同時操作一個文件的現象,所以所有文件的處理必須通過唯一的實例來進行。
  • 3、一些設備管理器常常設計爲單例模式,比如一個電腦有兩臺打印機,在輸出的時候就要處理不能兩臺打印機打印同一個文件。

優點:

  • 1、在內存裏只有一個實例,減少了內存的開銷,尤其是頻繁的創建和銷燬實例(比如管理學院首頁頁面緩存)。
  • 2、避免對資源的多重佔用(比如寫文件操作)。

缺點: 沒有接口,不能繼承,與單一職責原則衝突,一個類應該只關心內部邏輯,而不關心外面怎麼樣來實例化。


設計模式之觀察者模式

在觀察者模式中,觀察者需要直接訂閱目標事件;在目標發出內容改變的事件後,直接接收事件,並作出響應,對象常是 一對多關係。(一個變化,其他收到後作出自己的反應)

例子: 新聞發佈會,此時發言人是 目標對象,其他記者 會隨着發言人的發言(發生了改變),而作出了響應(其他對象會隨着處理自己的具體反應)。

常見場景: 各種 MVC 的框架中,Model 的變化通知各種類型的 View 時,幾乎都存在這種模式。

實現思路: 將問題的職責解耦和,將 Observable 和 Observer 抽象開,分清抽象和實體。(也就是,將 目標對象,還有收到目標對象的其他對象,抽象分離開)
Observer 是觀察者,一般抽象成純虛函數的基類(因爲多個觀察者,但是每個觀察者具體的反應不同,這個時候就可以繼承,將不同觀察者作爲不同子類,這樣子就可以實現觀察者後續不同的反應。這就用到了,基類和子類,還有動態多態的 virtual 的子類函數重寫)
Observable 是目標事件(被觀察的)成員變量:有一個list 鏈表,用於記錄,觀察者的清單。有幾個成員函數:增加觀察者進觀察者清單,將觀察者從觀察者清單中去除,目標對象的狀態改變(只有改變了才通知觀察者),通知觀察者目標對象已經已經發生改變了。

當對象間存在一對多關係時,則使用觀察者模式(Observer Pattern)。比如,當一個對象被修改時,則會自動通知依賴它的其他對象。觀察者模式屬於行爲型模式。

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

主要解決: 一個對象狀態改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協作。

何時使用: 一個對象(目標對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。

如何解決: 使用面向對象技術,可以將這種依賴關係弱化。

關鍵代碼: 在抽象類裏有一個 ArrayList 存放觀察者們。

應用實例:

  • 1、拍賣的時候,拍賣師觀察最高標價,然後通知給其他競價者競價。
  • 2、西遊記裏面悟空請求菩薩降服紅孩兒,菩薩灑了一地水招來一個老烏龜,這個烏龜就是觀察者,他觀察菩薩灑水這個動作。
  • 3、新聞發佈會,此時發言人是 目標對象,其他記者 會隨着發言人的發言(發生了改變),而作出了響應(其他對象會隨着處理自己的具體反應)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章