使用事件实现观察者模式
本文关键字:观察者模式 实现 事件 | 更新日期: 2023-09-27 18:34:25
我正在开发一个Silverlight应用程序,其中我过度使用了观察者模式。在我的实现中,我创建了两个接口IObservable<T>
和IObserver<T>
。前者包含将观察点附加到可观察量和分离观察器的方法。后者有一个方法Notify(IObservable<T> observable, ...)
当可观察量改变其状态时,可观察量通过observer.Notify(this, ...)
将自身作为参数传递
现在我偶然发现了"事件",对我来说,这似乎就像是观察者模式的实现,只是代表而不是前面提到的Notify
方法。是吗?
我对委托了解不多,也不想花费数小时重写我的代码,只是为了最终得到与它已经做同样的事情的代码。另一方面,事件可能优于基于接口的观察者模式。我错过了什么吗?
事件是观察者模式的实现。
事件实现为在引发通风口时要调用的方法列表。
委托是方法引用:与 Java 相比,C# 提供了一种引用方法的方法。
使用事件并不比自己实现观察者模式更好。但是事件提供了一种非常通用的方式来做到这一点,并且在许多情况下针对任务进行了高度优化,因此提供了一种更有效、更方便的组织方式。
委托由预期方法的签名定义。例如:
public delegate void FooMethod (Bar x, Baz y);
您可以为给定Bar
和Baz
void
方法定义委托。因此,如果您有以下类的实例:
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
(侦听器(:
SomeEvent += q.Method;
通过 -=
运算符删除委托,并使用以下命令调用事件:
SomeEvent(new Bar(), new Baz());
就像您调用执行调度的单个方法一样。
通过调用event
,将按注册顺序调用所有已注册delegate
。
注意:通过调用
SomeEvent(new Bar(), new Baz());
这并不意味着每个委托都收到new
实例:首先构造实例并在所有委托调用中共享。
结论:我认为 C# 设计人员在引入观察者模式方面做得很好,因为程序员不再负责自己正确编程。此外,这些事件易于理解并使用方便的语法。然而,在特殊情况下,程序员可能需要自己实现一个观察者。但这些都是非常罕见的情况。