MFC和设计模式

浅谈MFC中的设计模式 网络上有很多讲解MFC的书和资料,这些书和资料大体可以分为2种类型:1、API参考及使用示例;2、源码分析。第1类着重介绍MFC包含哪些类、有哪些成员函数以及这些成员函数该如何使用,比如《MFC Windows程序设计》;第2类着重介绍MFC是如何对WIN32 API进行封装的, 阅读详情

  MFC不是唯一一个使用了设计模式的程序库,也不可能是唯一的一个。可以肯定的说,所有好的框架必然是充满了好的设计模式。本文的目的在于提醒大家学习框架时,运用设计模式的理论和思想去理解其中众多的类之间的联系,从整体的角度去学习部分,显然比从部分去理解整体有更好的效果。本文的后面会给出MFC中的一些设计模式。

  但是,不得不悲哀的看到,MFC中的核心类CWnd(不知道的先拖下去打)违反了框架设计的一个基本准则:最小化。可以说,CWnd就是一个“根部肥大”的准则的好例子。不知道有多少人真正理解了CWnd中数以百计的成员函数?某种意义上,MFC普遍采用继承的方式实现,而很少采用组合类或者对象的方式,也是在一定意义上和软件设计模式相违背的。OO的三大特性中的继承,似乎误导我们尽可能的使用继承方式搭建框架,可是在设计模式中,可以看到组合是更加重要的方法。呜呼,本人也曾经是继承思想的受害者之一。

  不过,我必须承认,继承是比组合更加容易理解的方式,至少对于我如此。如果从完美的软件设计模式的角度,是否应该把CWnd拆分成更多的小接口?这样,我们的View,Dialog,button等等可以得到更加清晰的接口。但是这样的代价同样会增加框架的理解难度。从一个入门者的角度,我们不可能要求他先学习《设计模式》,然后去学习MFC。我的建议是,在学习MFC一段时间(半年?100个例子?理解MFC的20个类?)后,应该结合设计模式去学习。或许这也是学习框架的一个良好途径。

  不得不提醒诸位,请注意对于模式设计的过分使用的后果。netwind (往事如风)的文章(模式设计与形式主义)http://www.sawin.com.cn/doc/SD/Pattern/pattern.htm是一个非常好的例子。对于本人的经历,在刚开始接触设计模式思想的时候,简直有醍醐灌顶的感觉,啊,上帝,我以前的程序为何如此之烂?!现在,我要承认,设计模式好,但是使用不易,尤其对于我这个懒惰的Programmer,“原理要深,应用要快”是我的目标。这一点从我的“金山词霸的词库读取程序”中可以感受,一个运行了一个多小时的程序,我也会懒得再优化。:)

  小注:当然,众多晦涩难以理解的宏也为MFC的框架理解增添了不少“光彩”。一定程度上,我同意bigwhiteshark同志在http://dev.youkuaiyun.com/article/20/20831.shtm (对VC的批判,我要打击大家学VC的积极性了…… )文中的观点:从微软的策略看VC的前途!微软的策略是先用.net提供一个新的环境,然后逐步修改其OS,最终完全抛弃NT内核,其最终目的是抢占被UNIX和LINUX占据的高端市场份额(这是Borland李维说的,我觉得有道理)。现在推出的.net框架还支持原来的技术(如COM+),VC.net中也还有MFC7,但这只是一个过渡时期的产品,就象Windows 3.1被Windows 95取代一样,最终是要被抛弃的。

  最后的建议:限于本人的理论水平和时间精力,建议大家把自己对MFC中设计模式的理解也综合起来,相信这个是非常有意义的工作。我会继续进行这个工作的。

欢迎在我的blog:caijingwei.blogcn.com 上发表评论。

 

Factory

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

框架创建它的View的过程。CFameWnd就是一个Creator,通过调用CFrameWnd::CreateView()创建不同的ConcreteProduct。

说明:其实CreateView()和动态创建对象的技术密切相关。这是MFC中一个比较有趣的设计,和C++的RTTI(运行时类型信息)不同。大家可以去研究RUNTIME_CLASS, DECLARE_DYNAMIC, DECLARE_DYNCREATE这几个宏。

 

Builder:

将一个复杂对象的构建和它的表示分离,使得同样的创建过程可以创建不同的表示。

在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中,创建框架窗口的过程:

m_wndDlgBar.Create()

m_wndReBar.Create()

m_wndStatusBar.Create()

是否可以理解为一个简化了的Builder模式?Director和Builder都是CMainFrame。

Adapter

将一个类的接口转换成客户希望的另外一个接口。

STL中的适配器:stack,queue,priority_queue。可以看作简化的Adapter模式,它改变了基类的接口,但是并没有组合其它对象。

说明:STL并不是MFC的一部分,是C++标准库的一部分,之所以放在本文中,可以认为是作者的偷懒。:)

Composite:    

所有的窗口类都从CWnd派生,而派生的窗口类又可以包含其它从CWnd派生的类,窗口间的父子关系构成了窗口的树形结构。这种机制就是设计模式中典型的结构型模式COMPOSITE(组合),即某个对象拥有一系列类似的对象,而这一系列对象中的每一个又拥有一系列的对象,如此递归下去,管理起来很方便。这是Windows消息处理的基本模型。

 

Proxy

为其它对象提供一种代理以控制这个对象的访问。智能指针(smart pointer),比如_com_ptr_t

 

Template:

相信学习MFC的同志有一个普遍的感觉:不知道使用哪个消息映射函数,即不知道哪里写代码。比如CDocument的OnNewDocument(),OnOpenDocument(),OnSaveDocument(),OnCloseDocument()。又比如打印的流程相关函数:PreparePrinting(),OnBeginPrinting(),OnPrepareDC(),OnPrint(),OnEndPrinting()。实际上这就是运用了Template模式:定义一个操作中的算法框架,而将一些步骤延迟到子类中。目的是使得子类不需要改变一个算法的结构即可重定义算法的某些特定步骤。很重要的一点是:基类必须指明哪些是钩子操作(可以选择被重定义),哪些是抽象操作(必须被重定义)。

Iterator:

STL中的Iterator,从名字和运作方式都很好的吻合了Iterator模式。如果要更加细分,STL中的Iterator属于外部迭代器,即由客户来控制迭代。

C#和VB中的foreach()语句。foreach()语句中操作的对象集合必须实现一个内部迭代器。

 

MVC

MVC模式是一个用于将用户界面逻辑与业务逻辑分离开来的基础设计模式,它将数据处理、界面以及用户的行为控制分为:Model-View-Controller。 

Model:负责当前应用的数据获取与变更及相关的业务逻辑 

View:负责显示信息 

Controller:负责收集转化用户的输入 

View和Controller都依赖于Model,但是Model既不依赖于View,也不依赖于Controller,这是分离的主要优点之一,这样Model可以单独的建立和测试以便于代码复用,View和Controller只需要Model提供数据,它们不会知道、也不会关心数据是存储在SQL Server还是Oracle数据库中或者别的什么地方。 。

MFC中的Doc-View结构可以看作是这种模式的一个简化,Document类相当于Model,似乎没有明确出现Controller,Controller的功能可以在Document类中实现。

Qt vs MFC (Qt和MFC的战争) 在网上看到的,拿来和大家一起讨论下。蓝字均为转载 我曾经使用过QT和MFC来开发过软件,我想和大家分享我使用他们时所体会的不同之处。 我并非一个职业作家,这篇文章可能看起来不如专业的杂志和网站上的那么条理清晰。但是,我在这里是用我自己的语言来表达我自己的经验,希望能和你分享。英语比不是我的母语,所以可能会有一些用词古怪,词句错误之处,请发信给我,我可以改正他们。 阅读详情

相关推荐

MFC和QT的区别

MFC(微软基础类库)是专门为windows设计的一个用于开发图形用户界面的类库。MFC或多或少使用了面向对象的方法包装了Win32的API,正因如此,这些API有时是C++,有时是C,甚至是C和C++的混合体。 Qt这个C++的图形库由Trolltech在1994年左右开发。它可以运行在Windows,Mac OS X, Unix,还有像Sharp Zaurus这类嵌入式系统中。Qt是完全

zhanghuan_wangkai的博客 5804

转:MFC与设计模式

转:MFC与设计模式 MFC与设计模式 本文主要讨论三个设计模式在MFC中的应用。 这三个设计模式分别为:单件、桥和观察者模式。 一。创建型:单件模式(Singleton)     任何MFC应用程序首先创建一个应用程序对象(一个继承自CWinApp类的类的对象),一个MFC程序实例只能有一个应用程序对象。只能创建一个对象的机制由CWinApp来保证。在CWinApp的构造函数中有如下

quasiceo 568

MFC框架中的设计模式分析

MFC框架中的设计模式分析,比较全面的分析了设计模式在MFC中的应用

MFC 与 设计模式

设计模式是用来为重复出现的问题提供解决方案。它帮助设计者将系统分解成相互合作的对象集并发现其关系。它为我们提供了一种用来交流设计原则的公共词汇。有两种分类的方法。一种按目的(创造型,结构型,行为型),另一种按作用域(类或对象)。创造型关注对象的创造,结构型关注对象的组成,行为型关注对象的交互和责任的分布。类作用域下的模式关注静态类关系,而对象模式关注动态对象的交互。MFC是C++程序员使用

旅途 908

单片机通信总述——理论部分(CAN、串口、SPI、I2C等)

并行通信:传输原理:数据各个位同时传输;优点:速度快; 缺点:占用引脚资源多。是指使用 8、16、32 及 64 根或更多的数据线(有多少信号为就需要多少信号位)进行传输的通讯方式,可以同一时刻传输多个数据位的数据。串行通信: 传输原理:数据按位顺序传输;优点:占用引脚资源少; 缺点:速度相对较慢。是指设备之间通过一根数据信号线,地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式,同一时刻只能传输一位(bit)数据。 单工: 数据传输只支持数据在一个方向上传输。信息只能单方向传输的工作方式,一

qq_42475191的博客 1万+

星宸科技SSD20x/SSD21X应用层DEMO实战指南:从入门到深度定制

本文详细介绍了星宸科技SSD20x/SSD21X系列芯片的应用层DEMO开发实战,从基础环境搭建到深度定制开发。内容涵盖DEMO资源获取、核心功能实现、第三方库集成以及性能优化技巧,帮助开发者快速掌握智能显示和多媒体处理应用的开发方法。特别适合嵌入式开发者在智能家居、工业控制等场景中应用。

weixin_42524226的博客 268

介绍MFC框架中涉及到的设计模式(一)

最近看了几篇有关MFC框架中涉及到的设计模式的论文,为帮助大家深入了解MFC框架特此总结,希望能帮助到大家。 简单介绍设计模式 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 设计模式分为三种类型:创建型模式、结构型模式,行为型模式。 ...

dgh18494的博客 363

WebVTT中的文本轨道(Text Tracks,TT)到底是什么鬼?

WebVTT,全称是The Web Video Text Tracks Format,意思是网络视频文本轨道格式。那么到底什么是文本轨道(Text Tracks)呢?这篇文章希望一探究竟。

码农1479的博客 1986

dll中def和exp文件作用 MFC框架涉及的几个设计模式 等。。

dll中def和exp文件作用 https://blog.youkuaiyun.com/lgstudyvc/article/details/7939660 介绍MFC框架中涉及到的设计模式(一) https://www.cnblogs.com/BBOOT/p/3771426.html

thanklife的专栏 539

电源完整性仿真流程梳理

可根据仿真流程导图,一步一步的去设置完成仿真。仿真的关键,在于对电路回路的理解以及所放置的电压源与电流的合理性,对于去耦电容的选择,则需要根据谐振频率计算,从而选取有效滤波的容值。

csy17729158342的博客 3442

GT-Power柴油机瞬态性能仿真与优化——基于EGR-VGT耦合控制策略【附案例】

本文探讨了GT-Power在柴油机瞬态性能仿真与优化中的应用,重点分析了EGR-VGT耦合控制策略的实际效果。通过案例研究展示了如何通过仿真优化提升柴油机的动力响应速度和排放性能,为车辆工程领域的工程师提供了实用的技术参考。

green的博客 763

MFC的MVC设计模式

      最近公司需要接手一个很老的MFC项目,看到凌乱的目录结构,一个个超过7000行的代码文件,深深质疑难道写MFC不用MVC设计模式 ,于是百度下,其实是有的。 MVC结构模式,如下图所示: 在MFC中实现经典的MVC结构,如下图所示: 注意: 1、Document和View之间的绑定:View绑定到Document。 2、Frame作为Controller时,由于可以接收...

嘟嘟熊的专栏 1054

医药领域知识图谱快速及医药问答项目(项目全过程)

该项目是中科院软件所刘焕勇老师在github上的开源项目,基于知识图谱的医药领域问答项目 Github项目地址:mirrors / liuhuanyong / qasystemonmedicalkg · GitCode 一、项目环境搭建 该部分要十分注意,由于版本升级的问题,一些用法及格式已经不兼容了。 python3.8 下载地址:Python Release Python 3.8.10 | Python.orght...

qq_52062182的博客 9917

MFC中的设计模式之厂(Factory)

引子:网上对MFC的批评不绝于耳,说MFC这样,那样不好,甚至有网友直接用“烂”来形容MFC。我学习MF C也有一段时间了,我自己感觉我的MFC水平也就是中等偏下,离熟练运用MFC还有一段距离。我深刻体会到学习MFC的“痛苦”,所以在工作中我一般都尽量避免使用MFC。前几天在优快云中看到关于MFC中用到了那些设计模式的讨论,顿时觉得这是一个很有意义的讨论。为什么我们不可以换一个角度,从实现者的角

Computer Graphics Changes Your Life 2359

LVGL core theme主题管理(lv_theme.c)

如果打开宏,主题的初始化是在显示设备注册时完成的。整个themes的实现放在目录下面。这里一共有三套主题(basic、default和mono)可供选择或者参考。源码中默认对接的是 default 主题,所以在中,看到的是调用default主题的接口。也就是说,如果需要更换主题,把这里面的接口换掉就可以了。或者要重新做一套主题,参考这些实现修改也就可以了。虽说有三套主题,但逻辑流程是一样的。主要完成两个工作:构造lv_theme_t结构体和初始化默认样多备用(style_init函数内实现)。构造。....

Bigan(安)的博客 3413

【项目实战】SOVD协议(面向服务的车辆诊断协议)

此外,AUTOSAR组织将SOVD部分内容的软件实现定义在了R22-11及以上版本的AUTOSAR Adaptive规范中,还支持动态发现车内诊断功能、获取高性能计算机(HPC)的Log信息等新的诊断需求,更符合当前软件定义汽车概念下的行业趋势。而SOVDGateway作为边缘节点,也肩负着对SOVD Client进行认证以及权限控制的责任,从而保证车辆的信息安全。相较于传统的UDS(Unified Diagnostic Services)协议,SOVD不仅保留了传统的读写数据、例程控制、故障读取等功能,

奶爸的编程之路,也就一周冷个三天 1905

Qt和MFC的比较

在当今基于C++的图形界面开发领域,能与Qt相抗衡的只有MFC。MFC是微软公司的基础类库,自然得天独厚,比如开发深层次的Windows应用远超Qt,但Qt也有杀手锏,那就是跨平台。这两点大家一目了然,下面我们再来比较一下它们的其他特点。 (1)开发速度就整体而言,MFC可能会快捷一些,因为Windows平台的开发工具大多很智能,因为立足于Windows的开发人群很广,从菜鸟到专业人士(开发人员一多,技术参考就多,周围可以咨询问题的人就多)。相比较而言,Qt基于Linux,可用的开发工具不多,而且这些工具

肖邦的夜曲的专栏 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MFC右下角动画弹出窗口类 MFC托盘程序类(转)

  自己是一个不善管理时间的人,有时为了一两个小程序浪费一天的时间,所以最近为自己做一个类似课程表的软件,就是我先规定XX点到XX点要干什么,把一天的计划输入进去,到时间分界点时,我的软件会自动提醒我该时间段到了,该进入下一个工作阶段。规化一下整个系统后决定系统启动后以托盘图标的形式工作,用防QQ右下角弹出信息+声音的方式来提醒自己。最近对设计模式和重构细心研究了一下,所以把能完成

学无紫晶 3446

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: Virtual的理解
下一篇: CDialog的派生类中OnOK()函数和virtual的关系
ecai
博客等级 码龄26年 6粉丝 27原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值