浅谈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方法从文档对象获取更新数据。

你可能感兴趣的:(C/C++,编程原理)