Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用事件实现观察者模式_C#_Events_Observer Pattern - Fatal编程技术网

C# 用事件实现观察者模式

C# 用事件实现观察者模式,c#,events,observer-pattern,C#,Events,Observer Pattern,我正在开发一个Silverlight应用程序,其中过度使用了observer模式。在我的实现中,我创建了两个接口IObservable和IObserver。前者包含将观察者附加和分离到可观察对象的方法。后者有一个方法Notify(IObservable-observable,…),可观察对象通过observator将自身作为参数调用。当可观察对象的状态发生变化时,通知(this,…) 现在,我偶然发现了“事件”,对我来说,这几乎就像是观察者模式的一个实现,只是使用委托而不是前面提到的Notify

我正在开发一个Silverlight应用程序,其中过度使用了observer模式。在我的实现中,我创建了两个接口
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#
中,筛选(不处理某些订阅者的事件)是订阅者自己的工作。所有事件处理程序在引发(调用)事件时都会被调用,但每个事件处理程序都可以在何时运行或不运行时做出自己的决定。我将在此链接上阅读观察者模式不同实现的比较: