本文转载自:https://www.cnblogs.com/zhehan54/p/6403506.html
如有法律风险可联系鄙人QQ邮箱 344864055。
最近在学习设计模式,突然想到MFC里面其实也包含有设计模式的原理,于是分析了一下,做一个笔记,网上也找了一些资料,在此一并感谢。
创建型模式
单例模式(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方法从文档对象获取更新数据。
模板方法模式
模板方法模式中,基类用一些抽象的操作定义了一个算法的骨架,子类重定义算法中的特定部分,以完成特定于子类的各种操作。类CView(AbstractClass)里面的函数OnPaint、OnDraw。用户只需在CView的派生类中的OnDraw
函数中编写代码就可实现数据的正确显示,而不必关心OnDraw如何被调用。
职责链模式
多个对象组成一个对象链,客户请求沿着对象链进行传播,直到有一个对象处理它。在MFC中,所有派生自CCmdTarget的类都能够响应命令消息(WM_COMMAND),所有派生自CWnd的类都能够响应标准Windows消息(除 WM_COMMAND 之外的消息)。因 CWnd派生于CCmdTarget类,故派生自CWnd的类也可响应命令消息。
中介模式
用一个中介对象来封装一系列的对象交互。中介模式将一系列对象间的多对多的通信转化为中介对象与各个对象的一对多的通信,从而使其耦合松散,而且可以独立的改变它们之间的交互。
MFC中对话框类作为中介类,对话框上的其它控件作为同事类。如编辑框,按钮,下拉链表框等。当对话框上的两个或多个控件需要通信时(如编辑框输入有效数据后使按钮使能),发送消息的控件首先将消息发送到它的父窗口(对话框),然后父窗口将收到的消息转发到各目标控件。