淺談MFC中的設計模式

網絡上有很多講解MFC的書和資料,這些書和資料大體可以分爲2種類型:1、API參考及使用示例;2、源碼分析。第1類着重介紹MFC包含哪些類、有哪些成員函數以及這些成員函數該如何使用,比如《MFC Windows程序設計》;第2類着重介紹MFC是如何對WIN32 API進行封裝的,比如《MFC技術內幕(MFC Internals)》。第1類資料適合作爲編碼過程中的參考手冊,相當於MSDN;第2類資料既可以滿足技術愛好者對MFC技術內幕的好奇心,也可以加深對面向對象編程框架的理解。


但是以上這2類資料其實都是從相對較低的一個抽象層次和微觀的角度來看待MFC,過於關注MFC的實現細節;而忽略了MFC作爲一個整體,各個部分是如何進行組合從而構成這樣一個強大而複雜的面向對象框架。而設計模式其實研究如何在類和對象之間分配職責、類和對象之間如何協調以完成特定的問題。


可能由於MFC誕生的時代設計模式還沒有這麼廣泛的流行,所以MFC中設計模式的痕跡並沒有那麼明顯;但是其實任何面向對象的框架都多多少少的使用了各種設計模式。通過探尋MFC中隱含的設計模式,能夠幫助我們更加深刻的理解MFC,從而使我們認識到MFC並不是一堆零散的類和函數,而是相互之間有緊密關聯的一個有機的整體。

Gof4(四人幫)的經典書籍《設計模式--可複用面向對象軟件的基礎》總結了23種設計模式,並將其分爲3中類型:創建型模式、結構型模式、行爲型模式。本文將結合MFC針對這3中類型的模式各舉一例。

創建型模式
單例模式(Singleton Pattern)
單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。這個類稱爲單例類。
任何MFC應用程序的第一步就是創建一個應用程序對象(CWinApp或者其子類的實例)。在一個MFC應用程序中只能有一個應用程序對象,而且只有一個獲取這個對象的全局入口點(AfxGetApp()),所以CWinApp及其子類均屬於單例類(Singleton class)。


結構型模式
橋接模式(Bridge Pattern)
橋接模式是指將接口和實現解耦,從而二者可以獨立變化。
在MFC中,將對象存儲到持久化介質中或者從持久化介質取回對象的機制稱爲序列化/反序列化(Serialization/Deserialization)。MFC使用橋接模式實現了序列化/反序列化,CArchive類提供了序列化/反序列化的接口,而CFile及其子類則提供了序列化/反序列化的實現(比如內存、硬盤文件、Sockets等等)。
CArchive接受一個CFile或者其子類的對象作爲構造函數的參數,從而獲取包括文件名稱、請求的操作類型(讀/寫)等必需的序列化信息。客戶端使用CArchive對象執行序列化/反序列化操作,而無需關心CFile所採取的具體的持久化機制。

行爲型模式
觀察者模式(Observer Pattern)
在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。
MFC中的文檔/視圖結構其實是觀察者模式的一種變體。文檔包含數據對象,充當目標角色;用戶通過視圖更新文檔,視圖在這裏充當觀察者角色。一個文檔可以有多個視圖。一旦用戶通過某個視圖改變了文檔的數據對象,該視圖將通過調用UpdateAllViews方法來更新文檔。這將觸發OnUpdate方法,從而通知其他與文檔關聯的視圖更新顯示。視圖類通過重載OnUpdate方法從文檔對象獲取更新數據。

發佈了0 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章