看起来观察者设计模式是通过C#的事件委托模型内置的。是否有任何原因需要按照经典方式实现它?
敬礼
123开发者
看起来观察者设计模式是通过C#的事件委托模型内置的。是否有任何原因需要按照经典方式实现它?
敬礼
123开发者
你说得对。观察者模式在C#事件系统中使用委托实现。
你想要更接近传统观察者的原因之一是为了便于领域事件和/或组合应用程序体系结构的聚合。
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
IObserver<T>
和 IObservable<T>
接口以实现基于推送的通知系统。因此,我猜这就是您想要使用接口而不是基于事件的模型的情况之一。我同意.NET的事件处理程序可以满足大多数观察者模式的需求。然而,有几个接口你需要特别注意,尤其是在Silverlight和WPF中。这些接口是INotifyPropertyChanged和INotifyCollectionChanged。它们规定了Silverlight和WPF对数据绑定所期望的具体模式。此外,还有一个实现了INotifyCollectionChanged的ObservableCollection类;在构建Silverlight和WPF界面时,使用它可以省去很多麻烦。
我认为在C#中,经典的观察者设计模式被大大简化了。我认为可能存在一些情况,使用经典实现更加“安全”。我想到的是多线程和公共API。如果你按照经典方式进行单元测试,可能会更容易。但是,正如你所提到的,现在有了C#委托的更简单的快捷方式。抱歉,我没有一个明确的答案来说明何时必须使用经典模式。
这是对这个回答的回应:当然。这有点像问:“我应该实现迭代器模式还是使用foreach和IEnumerable?”
但是所选的答案非常好并且适用。嗯,事件可以用来实现观察者模式。事实上,使用事件可以被认为是观察者模式的另一种实现方式。