韩小明@xiammy的专栏

没水的地方挖井,有水的地方修渠

韩小明ID:xiammy
438177次访问,排名107好友11人,关注者66
毕业后一直在广联达工作
xiammy的文章
原创 174 篇
翻译 0 篇
转载 22 篇
评论 1131 篇
韩小明的公告
作者毕业于浙江大学,非常热爱体育运动。现在尤其热爱羽毛球运动。在休息时间非常热爱技术文章写作。
最近垃圾评论泛滥,为了不污染大家的视听,暂时关闭评论,请大家理解。
欢迎转载,但请注意,除非特别声明,本站采用Creative Commons License许可:署名,非商业。

最近评论
liquankun:瑞星还是不咋地!
白花了几个月的钱
外国的杀软不一定比国产的好!
但是国产的就是比不上国外的!
没办法!技术赶不上人家 还竟搞内讧
不经历大灾难 就不知道什么是团结!



正真的高手是不用杀毒软件的,没什么好不好的,是你自己技术不行而已
wangdei:http://www.bt285.cn BT下载 有300W部BT种子.
http://www.yaonba.com.cn NBA中文网 有200W条NBA直播
http://www.5a520.cn 小说520网 有300W部小说
http://www.bt285.cn/yazhou/ 亚洲BT 有BT亚洲
http://www.bjxlz.cn p……
hemir:不但不知道团结提高,倒是会找枪手到处胡闹。弄的整个环境乌烟瘴气的。
hemir:不但不知道团结提高,倒是会找枪手到处胡闹。弄的整个环境乌烟瘴气的。
hemir:枪手太多,大家都还是相信自己的眼睛吧。个人认为360做的不错。国内的杀毒软件确实不怎么地……
文章分类
收藏
    相册
    图书
    链接
    宗刚的专栏(RSS)
    快乐学习(RSS)
    陈亮亮的专栏(RSS)
    朋友
    张恂论 OO
    言之有李(RSS)
    赵伟的小家
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 剪贴板中的观察者(Observer)模式收藏

    新一篇: 利用权限禁止QQ的自动升级(QQUpdateCenter) | 旧一篇: 程序员的处世哲学:好酒不怕巷子深

    最近因为工作需要,使用到了剪贴板的特殊功能。也翻阅了一些网上介绍的资料,发现要实现类似FlashGet那样下载工具中监视剪贴板的实现方式,对我们程序设计有点借鉴的意义。

    在Windows提供的剪贴板API中,针对监视这块,提供的是注册机制。主要函数是SetClipboardViewer这个API函数。这个函数的声明是这样的(Delphi):

    function SetClipboardViewer(hWndNewViewer: HWND): HWND; stdcall;

    通过这个函数,将一个窗口句柄,注册到系统剪贴板中。可以称注册后的窗体为一个Clipboard Viewer,众多的Viewer形成一个Clipboard Viewer Chain。这个Chain是一个典型的链表,前一个记住下一个的指针。

    注册为Viewer的Handle所在的窗体,通过处理WM_CHANGECBCHAIN和WM_DRAWCLIPBOARD两个消息,来处理所有来自剪贴板的变化。处理这些消息的时候,记住向下一个Viewer传递消息,代码类似于

    SendMessage(hwndNextViewer, message, wParam, lParam);

    我重点并不是要说明代码如何编写,只是简单地介绍了这个“监控”的实现方式。我们很容易联想到,这和设计模式中提到的Observer模式是非常类似的。最大的不同点在于,剪贴板直接使用了消息系统作为解耦的方式。

    正因为有这个相似的地方,我才愿意仔细分析一下这种实现方式的优点和缺点。

    先来说说优点:

    1. 目标和观察者之间完全解耦,不需要定义特定接口。
    2. 观察者可以在任意Window上附加实现。这在很多窗体应用的程序来说非常方便。
    3. 可以很方便地实现跨进程、线程的观察者。这得益于标准的消息机制。
    4. 跨语言实现没有什么问题。
    5. 使用PostMessage和SendMessage可以实现两种完全不同的更新方式。Subject可以选择等待和不等待Observer更新完成。

    看了这些有点,最重要也是最核心的,就是解耦。再来分析一下缺点:

    1. 编程的过程,必须做到约定编程。约定编程和契约编程最大的差异在于没有编译机制。
    2. 在观察者中可以方便地改变后续观察者的行为,也可能完全破坏其他的正常功能。据说NetAnts曾经在这方面就有过BUG,导致其他程序无法粘贴数据。
    3. 一般我们的应用场景中,除了M-V(模型-视图)的模式,还有M-M(模型-模型)的方式,针对第二种方式,这种实现方式不是很适合。
    4. 没有消息系统的程序中,不适合使用。比如控制台程序。
    5. 对响应时间要求很高的系统,不适合。因为消息的响应时间不可控制。

    分析完上面的这些有点和缺点,我其实更倾向于从这类设计中吸取Message这个设计元素。巧妙地使用Message,可以有意想不到的效果。

    总结一下,设计模式的基本原则之一就是解耦,而Message的特性之一就是解耦。这也就是为什么我们会发现剪贴板的监视方式和我们学习的Observer模式很想像的根本。所以说他是模式一点也不为过。只不过少了点OO的味道。

    发表于 @ 2007年08月30日 23:18:00|评论(loading...)|编辑

    新一篇: 利用权限禁止QQ的自动升级(QQUpdateCenter) | 旧一篇: 程序员的处世哲学:好酒不怕巷子深

    评论

    #swimmer2000 发表于2007-08-31 14:00:43  IP: 172.20.2.*
    这是典型的职责链模式

    CHAIN OF RESPONSIBILITY(职责链模式)

    1.意图
    使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的偶合关系。将这些对象连成一条链、并沿着这条链传递请求,直到有一个对象处理它为止.
    #xiammy 发表于2007-08-31 14:03:52  IP: 59.108.103.*
    确实,一般观察者模式在实现的时候都是可以和责任链模式合用的。
    #shined_zhang 发表于2007-08-31 19:20:10  IP: 210.77.134.*
    路过
    #dounking 发表于2007-08-31 20:25:03  IP: 218.79.153.*
    典型的chain of responsibility中只要有一个viewer处理消息后,整个消息传递就结束了。所以个人认为这里还是叫observer好点。不过关键是能解决问题,这是最重要的:)
    #BlueTrees 发表于2007-09-01 19:50:32  IP: 125.119.50.*
    我认为是职责链模式。

    我觉得观察者模式和职责链模式的区别在于是否有一个集中的“协调人”就像delphi中DataSource。

    2007-09-02 09:29:19作者回复
    我也重新翻阅了职责链模式和观察者模式,我认为他们之间的相同的关键在于:<br />1.两者都有维护了一个链表<br />2.调用者和被调用者之间,都是解耦的。<br />但是,也有不同的地方:<br />职责链的最终目的是完成一件事,在链上的任意一个完成就是完成。而观察者不一样,可以一个都不做,被观察者不需要关心是否有处理。但是,必须保障每一个观察者都收到通知,类似一个广播
    #cncoc 发表于2007-09-02 23:46:00  IP: 124.64.163.*
    呵呵~不错噢!
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 韩小明