观察者设计模式似乎是通过其事件委托模型在C#中构建的。我有什么理由可以用经典方式实现它吗?
问候 123Developer
答案 0 :(得分:6)
通常,语言中内置的事件模型对于观察者模式就足够了。实际上没有理由以不同的方式实现它,因为你只是在重新创建事件。
话虽如此,很少有人改变“标准”事件模式。例如,我见过人们想要异步引发事件的情况。我通常不建议这样做(我个人认为这在订阅者方面可以更好地处理),但它仍然可以通过标准C#事件处理,但是稍微提升事件(使用GetInvocationList和异步调用委托)
答案 1 :(得分:3)
您想要更接近经典观察者的第一个原因是甚至聚合以促进域事件和/或复合应用程序体系结构。
jeremy miller在事件聚合器上有一篇很棒的帖子:http://codebetter.com/blogs/jeremy.miller/archive/2009/07/21/braindump-on-the-event-aggregator-pattern.aspx
我使用他的帖子来创建我的事件聚合器,我为winforms /掌上电脑应用程序添加了基于消息传递的架构:http://www.lostechies.com/blogs/derickbailey/archive/2009/12/22/understanding-the-application-controller-through-object-messaging-patterns.aspx
答案 2 :(得分:2)
我认为通常我们不应该使用C#委托模型来实现Observer模式。但是,在.Net 4中,他们添加了IObserver<T>
和IObservable<T>
接口来实现基于推送的通知系统。所以,我想这是你想要使用接口而不是基于事件的模型的情况之一。
答案 3 :(得分:1)
我同意.NET的事件处理程序可以满足您对观察者模式的大部分需求。但是,您需要注意几个接口,尤其是Silverlight和WPF。这些是INotifyPropertyChanged和INotifyCollectionChanged。这些规定了Silverlight和WPF对数据绑定所期望的特定模式。此外,还有一个实现INotifyCollectionChanged的ObservableCollection类;这在构建Silverlight和WPF接口时节省了很多麻烦。
答案 4 :(得分:0)
我同意C#中的经典观察者设计模式得到了极大的简化。我认为可能存在使用经典实现“更安全”的情况。想到的东西是多线程和公共API。如果你采用经典方式,我认为单元测试有时会更容易。但是,就像你提到的那样,C#代理现在有一个更简单的快捷方式。对不起,我不知道什么时候你必须使用经典模式。
答案 5 :(得分:0)
我会看一下这篇文章:
我特别喜欢Jon Skeet的一条评论:
绝对。这有点像问,“我应该实现迭代器模式还是使用foreach和IEnumerable?”
回答这个问题的答案很好:
嗯,可以使用事件来实现Observer模式。事实上,使用事件可以被视为观察者模式imho的另一种实现。
但选定的答案非常适用。