COM中好像用到了代理(Proxy)模式。
解决方案 »
- 大神求教啊!!MFC鼠标坐标检测!!
- 求助,这段代码看不懂 CDocument::SetModifiedFlag(bModified);的问题
- CRectTracker
- 求助关于Project dependencies的用法?
- HttpSendRequest超耗内存(3M),而且InternetCloseHandle后也不能释放,为什么?
- 请问为何调用CoGetClassObject会出现异常
- 请问为什么我的控件总被背景图遮住?
- 和串口通讯的问题,二进制传输数据?
- VC, 多语言编译的问题,Italy language resource file(*.rc)打不开,需要什么 ?
- 我用的是WIN98和VC6,但我想看WIN核心编程,有没有两全的办法呀?
- 哪位高手有The Art of Computer Programming《编程艺术》这本书?
- 有个问题,急!!!!!!!!!!!!
意图: 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
示例: STL中的Containers与Iterator
STL中,提供了很多总数据结构,为这些数据结构又定义了很多种统一迭代器,通过迭代器来访问数据结构的元素。这样就将数据的访问与数据的内部存储结构分隔开了,使所有的数据结构有共通的访问方式。●Template Method(模板方法)
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
示例:
这种模式在MFC源码中被大量使用。
典型的有: CView基类对WM_PANT消息的相应
void CView::OnPaint()
{
//处理流程
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}
然后派生类实现OnPrepareDC,OnDraw完成具体的步骤。
意图:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
示例:MFC中的 (Serialization) 序列化机制
在序列化机制中,CArchive 和 CFile共同完成了数据的永久存储
CArchive定义了数据存取的共用接口
而CFile及其派生类 则完成了存储过程的具体实现(文件、内存缓冲区等等)
这样,数据存储的接口部分与具体实现部分被分离了。给CArchive搭配不同的CFile派生类就可实现不同的物理存储。
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
示例:MFC 中的文档视图结构
一个文档对象可以对应多个视图对象,视图对象是对文档对象的诠释。
当文档对象发生变化后,调用UpdateAllViews 更新视图
然后各个视图的OnUpdate 被调用。
factory Method(工厂方法)
Proxy(代理)
两种模式,我还没找到具体的实例。
大家帮忙想想吧。
●Chain of Responsibility (职责链)
意图:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。示例:
MFC消息链
在MFC中各 CCmdTarget派生类定义自己对特定消息及命令的响应动作。
消息和命令沿着消息映射定义的链进行传递,直到有对象处理他。另感谢bgsn(不告诉你) 制作了 "设计模式迷你手册.chm "
本文中的 "意图" 字段都是从该chm中拷贝的。
参见: http://www.csdn.net/expert/topic/159/159403.shtm
竟FMD(Niko)自己回答了
谢谢你,给菜鸟们上了一课
在面向对象的程序设计中,由于C++的引入而显得尤为突出的一个问题是:
所有类最终是否都应从单独一个基础类继承。在Java中(与其他几乎所有OOP
语言一样),对这个问题的答案都是肯定的,而且这个终级基础类的名字很
简单,就是一个“Object”。这种“单根结构”具有许多方面的优点。单根
结构中的所有对象都有一个通用接口,所以它们最终都属于相同的类型。另
一种方案(就象C++那样)是我们不能保证所有东西都属于相同的基本类型。
从向后兼容的角度看,这一方案可与C模型更好地配合,而且可以认为它的
限制更少一些。但假期我们想进行纯粹的面向对象编程,那么必须构建自己
的结构,以期获得与内建到其他OOP语言里的同样的便利。需添加我们要用到
的各种新类库,还要使用另一些不兼容的接口。理所当然地,这也需要付出
额外的精力使新接口与自己的设计方案配合(可能还需要多重继承)。为得
到C++额外的“灵活性”,付出这样的代价值得吗?当然,如果真的需要——
如果早已是C专家,如果对C有难舍的情结——那么就真的很值得。但假如你
是一名新手,首次接触这类设计,象Java那样的替换方案也许会更省事一些。
单根结构中的所有对象(比如所有Java对象)都可以保证拥有一些特定的功能。
在自己的系统中,我们知道对每个对象都能进行一些基本操作。一个单根结构,
加上所有对象都在内存堆中创建,可以极大简化参数的传递(这在C++里是一个
复杂的概念)。
以上这段见Thinking in Java
MFC中所有继承自CObject的对象都可以具有一些共同的操作,包括
动态类型识别,动态生成等。所有继承自CCmdTarget的对象都可以对消息
进行处理等。
在MFC都是利用类似的方法。为了灵活和节约内存,没有采用继承的方法,
而是通过宏在每个类中加入了同样的结构(都放在Public部分),一般最后
都形成一条链。
如宏 DECLARE_DYNAMIC(class_name)
就是为类public部分添加了一个CRuntimeClass对象,当然是静态类型。
我觉得这有些像职责链。然后再加上模板方法,最后实现了MFC对各个请求
的分派和处理。