用事件实现观察者模式

我正在开发一个Silverlight应用程序,我过度使用了观察者模式。 在我的实现中,我创建了两个接口IObservableIObserver 。 前者包含将观察者附加到观察者的方法。 后者有一个方法Notify(IObservable observable, ...) ,当observable改变了它的状态时,observable通过observer.Notify(this, ...)传递自身作为参数。

现在我偶然发现了“事件”,对我而言,似乎这就是观察者模式的实现,只是代表而不是前面提到的Notify -method。 是对的吗?

我不太了解代表,也不想花几个小时重写我的代码只是为了最终得到与现有代码完全相同的代码。 另一方面,事件可能优于基于接口的观察者模式。 我错过了什么吗?

事件是观察者模式的实现。

事件被实现为引发通风口时要调用的方法列表。

代理是方法引用:与Java相比,C#提供了一种引用方法的方法。

使用事件比自己实现观察者模式更好。 但事件提供了一种非常通用的方式,并且在许多情况下高度优化了任务,从而提供了一种更有效和方便的方式来组织它。

委托由预期方法的签名定义。 例如:

 public delegate void FooMethod (Bar x, Baz y); 

在给定BarBazvoid方法定义委托。 因此,如果您有以下类的实例:

 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#设计师在介绍观察者模式方面做得很好,因为程序员不再负责自己正确编程。 此外,事件易于理解并使用方便的语法。 但在特殊情况下,程序员可能需要自己实施观察者 。 但这些都是非常罕见的场合。