最近因为工作需要,使用到了剪贴板的特殊功能。也翻阅了一些网上介绍的资料,发现要实现类似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模式是非常类似的。最大的不同点在于,剪贴板直接使用了消息系统作为解耦的方式。
正因为有这个相似的地方,我才愿意仔细分析一下这种实现方式的优点和缺点。
先来说说优点:
-
目标和观察者之间完全解耦,不需要定义特定接口。
-
观察者可以在任意Window上附加实现。这在很多窗体应用的程序来说非常方便。
-
可以很方便地实现跨进程、线程的观察者。这得益于标准的消息机制。
-
跨语言实现没有什么问题。
-
使用PostMessage和SendMessage可以实现两种完全不同的更新方式。Subject可以选择等待和不等待Observer更新完成。
看了这些有点,最重要也是最核心的,就是解耦。再来分析一下缺点:
-
编程的过程,必须做到约定编程。约定编程和契约编程最大的差异在于没有编译机制。
-
在观察者中可以方便地改变后续观察者的行为,也可能完全破坏其他的正常功能。据说NetAnts曾经在这方面就有过BUG,导致其他程序无法粘贴数据。
-
一般我们的应用场景中,除了M-V(模型-视图)的模式,还有M-M(模型-模型)的方式,针对第二种方式,这种实现方式不是很适合。
-
没有消息系统的程序中,不适合使用。比如控制台程序。
-
对响应时间要求很高的系统,不适合。因为消息的响应时间不可控制。
分析完上面的这些有点和缺点,我其实更倾向于从这类设计中吸取Message这个设计元素。巧妙地使用Message,可以有意想不到的效果。
总结一下,设计模式的基本原则之一就是解耦,而Message的特性之一就是解耦。这也就是为什么我们会发现剪贴板的监视方式和我们学习的Observer模式很想像的根本。所以说他是模式一点也不为过。只不过少了点OO的味道。
分享到:
相关推荐
观察者模式(Observer)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在C++中广泛应用,特别是在需要...
在观察者模式中,通常有两个主要角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它持有一个观察者列表,并负责通知这些观察者状态的变化。观察者是依赖主题的对象,当接收到主题的通知时,它们会...
观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...
观察者模式(Observer)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在软件开发中广泛应用于事件处理和实时...
观察者(Observer)模式是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java编程语言中,这种模式被内置在`java.util.Observable`和`java.util.Observer`类...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...
5. **解耦合**:Observer模式通过定义一种松散耦合的关系,使得被观察者和观察者可以独立地进行工作。这提高了系统的可扩展性和可维护性。 在实际应用中,例如,当我们开发一个实时数据显示系统,可以将数据源作为...
观察者模式可以通过多种编程语言实现,例如在Java中,可以使用`java.util.Observable`和`java.util.Observer`接口。被观察者实现`Observable`接口,而观察者实现`Observer`接口。当被观察者状态改变时,调用`...
在观察者模式中,主要有两个核心角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它负责存储观察者,并提供添加、删除观察者以及通知观察者更新的方法。观察者则是对主题感兴趣的对象,它们通过...
在观察者模式中,有两类角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它维护着一个观察者列表,并负责在状态改变时通知所有观察者。观察者是对主题感兴趣的实体,它们会在接收到主题的通知后...
**C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...
观察者模式是23种设计模式中的一种,尤其是在软件设计过程中体现的更是立足无穷。本文将详细讲解观察者模式的概念和实现,通过代码注释来解释各个组件的作用。 一、观察者模式的定义 观察者模式是一种行为设计模式...
可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口。 2.Observer(观察者) 为那些在目标发生改变时需获得通知的对象定义一个更新接口。 3.ConcreteSubject(具体目标) 将有关状态存入...
Observer观察者模式是一种设计模式,属于行为模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式广泛应用于事件驱动编程和实时系统...
观察者 Observer 模式定义:在对象之间定义了一对多的依赖关系 这样一来 当一个对象改变状态时 依赖它的对象都会收到通知并自动跟新 Java已经提供了对观察者Observer模式的默认实现 Java对观察者模式的支持主要体现...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动编程或者...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...
在观察者模式中,被观察者维护观察者对象的集合,当被观察者对象变化时,它会通知观察者。观察者模式主要是用于解决对象之间一对多的关系。 类视图 实现 class Observer { public: virtual ~Observ
在Java中,我们可以使用`java.util.Observable`和`java.util.Observer`接口来实现观察者模式。但在这个例子中,我们可能看到的是自定义实现的观察者模式,因为文件列表中包含的`Test.java`, `Customer1.java`, `...