我正在开发一个Silverlight应用程序,我过度使用了观察者模式。在我的实现中,我创建了两个接口IObservable<T>
和IObserver<T>
。前者包含将观察者附加到观察者的方法。后者有一个方法Notify(IObservable<T> observable, ...)
,当observable改变了状态时,observable将自己作为参数通过observer.Notify(this, ...)
调用。
现在我偶然发现了#34;事件&#34;对我而言,似乎这就是观察者模式的一个实现,只是代表而不是前面提到的Notify
- 方法。 是吗?
我对代理人了解不多,并且不想花费数小时重写我的代码只是为了最终得到与现有代码完全相同的代码。另一方面,事件可能优于基于接口的观察者模式。我错过了什么吗?
答案 0 :(得分:8)
事件是观察者模式的实现。
事件被实现为引发通风口时要调用的方法列表。
代理是方法引用:与Java相反,C#提供了一种引用方法的方法。
使用事件比自己实现观察者模式更好。但事件提供了一种非常通用的方式,并且在许多情况下高度优化了任务,从而提供了一种更有效,更方便的方式来组织它。
委托由预期方法的签名定义。例如:
public delegate void FooMethod (Bar x, Baz y);
您为void
和Bar
Baz
方法定义代理。因此,如果您有以下类的实例:
public class Qux {
public void Method (Bar x, Baz y) {
//do something
return null;
}
}
然后你可以参考方法:
Qux q = new Qux();
FooMethod fm = q.Method;
event
因此是具有相同签名的delegate
列表:
您将事件定义为:
private event FooMethod SomeEvent;
您可以使用delegate
运算符添加+=
s(侦听器):
SomeEvent += q.Method;
通过-=
运算符删除委托,并使用以下命令调用该事件:
SomeEvent(new Bar(), new Baz());
好像你调用一个执行调度的方法。
通过调用event
,将按照注册顺序调用所有已注册的delegate
。
注意:通过调用
SomeEvent(new Bar(), new Baz());
,这并不意味着每个代理都会收到new
个实例:首先构建实例,并在所有代理上共享调用
结论:我认为C#设计师在介绍观察者模式方面做得很好,因为程序员不再负责自己正确编程。此外,事件易于理解并使用方便的语法。但在特殊情况下,程序员可能需要自己实现观察者。但这些情况非常罕见。