用事件实现观察者模式

杰姆·范丹

我正在使用Silverlight应用程序,在其中我过度使用了观察者模式。在我的实现中,我创建了两个接口IObservable<T>IObserver<T>前者包含将观察者附加到可观察对象的方法。后者具有一种方法Notify(IObservable<T> observable, ...)observer.Notify(this, ...)当可观察对象更改其状态时,可观察对象将自身作为参数传递

现在,我偶然发现了“事件”,对我来说,这似乎是观察者模式的一种实现,只是使用委托而不是上述Notify方法。是对的吗?

我对委托人了解不多,也不想花费数小时来重写我的代码,只是为了获得与已经完成的功能相同的代码。另一方面,事件可能优于基于接口的观察者模式。我想念什么吗?

威廉·范昂塞姆

事件是观察者模式的实现

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

委托是方法引用:与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是这样的列表delegates的相同签名:

您将事件定义为:

private event FooMethod SomeEvent;

您可以delegate使用+=运算符添加s(侦听器)

SomeEvent += q.Method;

-=操作员删除委托,并使用以下命令调用事件:

SomeEvent(new Bar(), new Baz());

就像您调用一个执行分派的方法一样。

通过调用eventdelegate将按注册顺序调用所有已注册的。

注意:调用SomeEvent(new Bar(), new Baz());此方法并不意味着每个委托都将接收new实例:这些实例首先被构造并在所有委托调用中共享

结论:我认为C#设计师在介绍观察者模式方面做得很好,因为程序员不再负责自己正确编程。此外,事件易于理解并且使用方便的语法。但是,在特殊情况下,可能需要程序员自己实施观察员但是这些是非常罕见的情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章