C# 用事件实现观察者模式
我正在开发一个Silverlight应用程序,其中过度使用了observer模式。在我的实现中,我创建了两个接口C# 用事件实现观察者模式,c#,events,observer-pattern,C#,Events,Observer Pattern,我正在开发一个Silverlight应用程序,其中过度使用了observer模式。在我的实现中,我创建了两个接口IObservable和IObserver。前者包含将观察者附加和分离到可观察对象的方法。后者有一个方法Notify(IObservable-observable,…),可观察对象通过observator将自身作为参数调用。当可观察对象的状态发生变化时,通知(this,…) 现在,我偶然发现了“事件”,对我来说,这几乎就像是观察者模式的一个实现,只是使用委托而不是前面提到的Notify
IObservable
和IObserver
。前者包含将观察者附加和分离到可观察对象的方法。后者有一个方法Notify(IObservable-observable,…)
,可观察对象通过observator将自身作为参数调用。当可观察对象的状态发生变化时,通知(this,…)
现在,我偶然发现了“事件”,对我来说,这几乎就像是观察者模式的一个实现,只是使用委托而不是前面提到的Notify
-方法是这样吗?
我对委托不太了解,也不想花几个小时重写代码,而只是为了得到与它已经做的事情相同的代码。另一方面,事件可能优于基于接口的观察者模式。我遗漏了什么吗?事件是观察者模式的实现 事件被实现为在引发通风时要调用的方法列表 委托是方法引用:与Java不同,C#提供了一种引用方法的方法 使用事件并不比自己实现观察者模式更好。但是事件提供了一种非常通用的方法来完成它,并且在许多情况下对任务进行了高度优化,因此提供了一种更高效、更方便的方式来组织它 委托由预期方法的签名定义。例如:
public delegate void FooMethod (Bar x, Baz y);
在给定条
和Baz
的情况下,可以为void
方法定义委托。因此,如果您有以下类的实例:
public class Qux {
public void Method (Bar x, Baz y) {
//do something
return null;
}
}
然后您可以参考以下方法:
Qux q = new Qux();
FooMethod fm = q.Method;
因此,事件
是具有相同签名的代表的列表:
将事件定义为:
private event FooMethod SomeEvent;
您可以使用+=
运算符添加委托
s(侦听器):
SomeEvent += q.Method;
通过-=
操作符删除代理,并使用以下命令调用事件:
SomeEvent(new Bar(), new Baz());
就好像调用一个方法来执行分派一样
通过调用事件
,将按照注册顺序调用所有已注册的代理
注意:通过调用SomeEvent(newbar(),newbaz())
这并不意味着每个委托都接收新的
实例:首先构造实例,并在所有委托调用中共享
结论:我认为C#设计人员在引入观察者模式方面做得很好,因为程序员不再负责自己正确编程。此外,事件很容易理解并使用方便的语法。然而,在特殊情况下,程序员可能需要自己实现一个观察者。但这是非常罕见的情况。现在,我的observables有一个NotifyAll()方法,它通过附加的观察者循环并调用其Notify方法。这相当于某个事件(new Bar(),new Baz())。稍后,我将只需要通知某些观察者,而这个决定将不得不在运行时做出。有什么办法可以通过活动来实现吗?@JCvanDamme:的确。这样做的好处是程序员不需要确保这些方法被正确地实现,当然这总是很好的。正如他们所说:软件设计是研究如何使系统防故障。宇宙是一个产生更大傻瓜的实验。目前宇宙正在获胜:P.(编辑:使用“it”我的意思是“如果(观察者B已连接),则不要通知也连接的观察者A”)只通知某些观察者
-这就是为什么标准事件将发送者
作为事件处理程序的参数的原因之一。在C#
中,筛选(不处理某些订阅者的事件)是订阅者自己的工作。所有事件处理程序在引发(调用)事件时都会被调用,但每个事件处理程序都可以在何时运行或不运行时做出自己的决定。我将在此链接上阅读观察者模式不同实现的比较: