【发布时间】:2013-06-10 08:46:53
【问题描述】:
我要做的只是实现观察者模式。
所以,我想出了这个解决方案:
我们有一个 PoliceHeadQuarters,其主要工作是向所有订阅它的人发送通知。考虑到 DSP、Inspector 和 SubInspector 类订阅了 PoliceHeadQuarters。
使用我编写的事件和委托
public class HeadQuarters
{
public delegate void NewDelegate(object sender, EventArgs e);
public event EventHandler NewEvent;
public void RaiseANotification()
{
var handler = this.NewEvent;
if (handler != null)
{
handler(this, new EventArgs());
}
}
}
public class SubInspector
{
public void Listen(object sender, EventArgs e)
{
MessageBox.Show(string.Format("Event Notification received by sender = {0} with eventArguments = {1}", sender, e.ToString()));
}
}
public class Inspector
{
public void Listen(object sender, EventArgs e)
{
MessageBox.Show(string.Format("Event Notification received by sender = {0} with eventArguments = {1}", sender, e.ToString()));
}
}
这就是我调用它的方式
var headQuarters = new HeadQuarters();
var SubInspector = new SubInspector();
var Inspector = new Inspector();
headQuarters.NewEvent += Inspector.Listen;
headQuarters.NewEvent += SubInspector.Listen;
headQuarters.RaiseANotification();
因此,只要调用 RaiseANotification() 函数,Inspector 和 SubInspector 类都会收到通知。
DotNet Framework 4、4.5 似乎支持了一种新的方式,叫做 IObserver 和 IObservable。
谁能给我一个在上述场景中使用 IObservable 和 IObserver 模式的超级简单示例?我用谷歌搜索只是发现互联网上的可用示例过于臃肿且难以理解。
我的小窍门:(可能我认为这是错误的)
class DSP : IObserver //since it observes the headquarters ?
class PoliceHeadQuarters: IObservable // since here's where we send the notifications ?
提前致谢。
编辑:有人还说 MSDN 文档对于 IObservable @ 也是不正确的 IObservable vs Plain Events or Why Should I use IObservable?.
【问题讨论】:
-
msdn.microsoft.com/en-us/library/dd990377.aspx - 有一个很好的例子,你为什么不尝试编译并运行它?
-
@Spook:问题实际上是我无法将我的场景与这些示例联系起来。任何骨架代码结构都应该可以帮助我走得更远..
-
看起来微软的例子是使用一个基本的事件聚合器。一种更复杂但最终更灵活的方法。 Aggregator 迭代 IObserver 的类型,按顺序调用它们。我认为这就是为什么使用基于接口的方法而不是委托的原因。
-
@DavidOsborne:是的,有点复杂。初学者有什么简单的例子吗?或者非常感谢此场景的任何骨架代码!
-
在这里查看 Jeremy Miller 文章中的“直接通信”部分:codebetter.com/jeremymiller/2007/06/04/… 他很好地概述了接口/委托方法的优缺点。
标签: c# design-patterns .net-4.5 system.reactive