基于观察者模式的事件委托在.NET中的实现与应用

基于观察者模式的事件委托在.NET中的实现与应用

摘 要:本文主要介绍观察者模式的基本概念,应用模型,以及在.NET中的实现。并且阐述基于观察者模式的事件委托的实现。

关键词:观察者模式;事件委托;.NET 中图分类号:TP311.10

软件设计模式是体现编程思想,优化程序效率的有效方法。使用设计模式可以提高代码重用性,保证代码可靠性。工厂模式,代理模式,原型模式等软件设计模式在实际编程中都有广泛的应用。本文将以观察者模式为例,说明其在程序设计中的实现以及在事件委托中的应用。 1 观察者模式

首先,介绍一下观察者模式的定义。观察者模式又称发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象。当这个主题对象状态发生改变时,会通知所有观察者对象,使其能够自动更新自己的状态。

下面我们更为具体的解释一下观察者模式。在一个公司里面,老板经常外出,又经常“空降”回来,

检查员工的工作状态。那么,很多员工为了既可以在老板不在的时候上网休闲,又不会让老板回来时发现自己在偷懒,就联系公司的前台秘书,在老板回来的时候通过拨打办公室的电话来通知大家老板回来了。在这个例子里面,我们很容易理解,员工就是观察者对象,而老板和前台秘书就是主题对象。 图1

如图1所示,Subject类就是抽象主题,它负责把所有观察者对象的引用保存在一个集合里面,每个主题可以有任意数量的观察者,抽象主题提供一个接口可以增加,删除和通知观察者对象。Concrete Subject类,是具体的主题,负责将有关状态存入具体观察者对象,在具体主体对象内部状态改变时,给所有注册的观察者对象发通知。在我们的例子中,老板和秘书都属于具体的主体对象。Observer类,是抽象观察者,负责给具体观察者定义接口,在得到主题的通知时更新自己。Concrete Observer类就是具体的观察者,实现抽象观察者的更新接口。办公室里的员工就是具体的观察者。下面就是.NET实现观察者模式的例子。 在介绍事件委托之前,我们先来总结一下观察者模式的优点以及不足。观察者模式应用在当一个对象的改变需要同时影响其它对象的改变的时候,为了维

持程序一致性,而又不增加耦合性,通过让耦合双方都依赖于抽象而非具体,使得各自变化都不会影响另一边的变化,这也是依赖倒转原则的体现。而之所以用接口而非抽象类来定义,是因为在实际的应用中,观察者们可能是毫不相关的类,但它们都根据主体对象的通知更新自己的状态,所以只抽象出方法给抽象观察者类。而观察者模式也存在不足的地方。 2 事件委托

观察者模式的不足之处体现在,一定要有一个公共接口Object类,并且每个具体的观察者对象都要是实现这个类,而Subject类要依赖与Object类,从前面的例子可以看出,Subject类需要依赖于Object中的Update()方法,就是说如果没有Object类,就没有办法实现通知的功能。以VS 2005为例,当运行程序点击运行按钮的时候,软件也页面会发生多处变化,其中包括工具栏,控制台窗体显示,工具箱消失等。而这些变化涉及到了多个组件由同一事件触发,符合应用观察者模式。但是这些组件早就被制造商封装了,没有办法让每个控件都去实现一个Object接口。那么如何来解决这个问题,就要应用到事件委托。 事件委托就是一种可以不依赖于抽象观察者对象,由客户端决定通知哪些观察者的机制。事件委托

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4