最近在學(xué)習(xí)設(shè)計(jì)模式,突然想到MFC里面其實(shí)也包含有設(shè)計(jì)模式的原理,于是分析了一下,做一個(gè)筆記,網(wǎng)上也找了一些資料,在此一并感謝。
創(chuàng)建型模式
單例模式(Singleton Pattern)單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。這個(gè)類稱為單例類。 任何MFC應(yīng)用程序的第一步就是創(chuàng)建一個(gè)應(yīng)用程序?qū)ο?CWinApp或者其子類的實(shí)例)。在一個(gè)MFC應(yīng)用程序中只能有一個(gè)應(yīng)用程序?qū)ο?,而且只有一個(gè)獲取這個(gè)對象的全局入口點(diǎn)(AfxGetApp()),所以CWinApp及其子類均屬于單例類(Singleton class)。 結(jié)構(gòu)型模式 橋接模式(Bridge Pattern)橋接模式是指將接口和實(shí)現(xiàn)解耦,從而二者可以獨(dú)立變化。
在MFC中,將對象存儲(chǔ)到持久化介質(zhì)中或者從持久化介質(zhì)取回對象的機(jī)制稱為序列化/反序列化(Serialization/Deserialization)。MFC使用橋接模式實(shí)現(xiàn)了序列化/反序列化,CArchive類提供了序列化/反序列化的接口,而CFile及其子類則提供了序列化/反序列化的實(shí)現(xiàn)(比如內(nèi)存、硬盤文件、Sockets等等)。
行為型模式
觀察者模式(Observer Pattern)在此種模式中,一個(gè)目標(biāo)物件管理所有相依于它的觀察者物件,并且在它本身的狀態(tài)改變時(shí)主動(dòng)發(fā)出通知。這通常透過呼叫各觀察者所提供的方法來實(shí)現(xiàn)。 MFC中的文檔/視圖結(jié)構(gòu)其實(shí)是觀察者模式的一種變體。文檔包含數(shù)據(jù)對象,充當(dāng)目標(biāo)角色;用戶通過視圖更新文檔,視圖在這里充當(dāng)觀察者角色。一個(gè)文檔可以有多個(gè)視圖。一旦用戶通過某個(gè)視圖改變了文檔的數(shù)據(jù)對象,該視圖將通過調(diào)用UpdateAllViews方法來更新文檔。這將觸發(fā)OnUpdate方法,從而通知其他與文檔關(guān)聯(lián)的視圖更新顯示。視圖類通過重載OnUpdate方法從文檔對象獲取更新數(shù)據(jù)。
模板方法模式中,基類用一些抽象的操作定義了一個(gè)算法的骨架,子類重定義算法中的特定部分,以完成特定于子類的各種操作。類CView(AbstractClass)里面的函數(shù)OnPaint、OnDraw。用戶只需在CView的派生類中的OnDraw
職責(zé)鏈模式
多個(gè)對象組成一個(gè)對象鏈,客戶請求沿著對象鏈進(jìn)行傳播,直到有一個(gè)對象處理它。在MFC中,所有派生自CCmdTarget的類都能夠響應(yīng)命令消息(WM_COMMAND),所有派生自CWnd的類都能夠響應(yīng)標(biāo)準(zhǔn)Windows消息(除 WM_COMMAND 之外的消息)。因 CWnd派生于CCmdTarget類,故派生自CWnd的類也可響應(yīng)命令消息。
中介模式 用一個(gè)中介對象來封裝一系列的對象交互。中介模式將一系列對象間的多對多的通信轉(zhuǎn)化為中介對象與各個(gè)對象的一對多的通信,從而使其耦合松散,而且可以獨(dú)立的改變它們之間的交互。
MFC中對話框類作為中介類,對話框上的其它控件作為同事類。如編輯框,按鈕,下拉鏈表框等。當(dāng)對話框上的兩個(gè)或多個(gè)控件需要通信時(shí)(如編輯框輸入有效數(shù)據(jù)后使按鈕使能),發(fā)送消息的控件首先將消息發(fā)送到它的父窗口(對話框),然后父窗口將收到的消息轉(zhuǎn)發(fā)到各目標(biāo)控件。
參考資料:http://blog.csdn.net/guolongcang/article/details/6754424
http://hi.baidu.com/piperworldcup/blog/item/1c54f7af12b1b1fefaed507f.html http://wenku.baidu.com/view/c7ca4bd950e2524de5187edd.html |
|