变更通知的最佳模式(事件或代表)

时间:2010-11-19 00:45:00

标签: c# .net events design-patterns delegates

我有一个解决方案,我将一系列项目从源传递给演示者。当源更新时,我希望能够通知演示者显示新结果。

我想到的是创建一个ChangeNotification类,将其与结果一起传递,并让该类通知演示者。现在,我认为这可以通过两种方式实现,或者ChangeNotification可以包含演示者订阅的事件,或者它可以具有演示者设置的委托和源调用(如果它不为空)。

使用事件的好处是,消费者可以对通知作出反应,并且您可以将响应式扩展连接到它,缺点是您必须管理事件的订阅/取消订阅以进行正确的垃圾收集。代表很简单,但你失去了一些灵活性。

这种情况最优雅的模式是什么?还有其他一些我没有想过的方法吗?

3 个答案:

答案 0 :(得分:3)

如果您有多个观察者,则需要Events或MultipleDelegates。如果你只有一个观察者,并希望强制执行,那么代表就足够了。然而,在最好的方面,恕我直言,我会说事件更灵活,非常适合这种模式。 ObservableCollection和INotifyPropertyChanged是基于事件的实现。顺便说一句,+1 to tbischel用于引用这些类。

答案 1 :(得分:2)

此场景有两种内置模式。

首先,您可以实现INotifyPropertyChanged接口。如果要通知演示者对集合中对象本身属性的更改,则更好。 (或源对象本身,如果发生更改的话)。

第二种方法是让您的演示者通过一个包含您对象的ObservableCollection。如果要通知演示者已从集合中添加或删除了某个项目,则更好。两者都是事件驱动的模型,任何订阅者都可以参与其中。


编辑:基础模式是"Observer"模式...如果需要,您可以推出自己的版本,你可以了解详细信息。

答案 2 :(得分:0)

我同意INotifyPropertyChanged,INotifyCollectionChanged和其他相关接口属性的第一个转向的其他答案,但我想添加第三个选项,即实现观察者模式。如果您不熟悉此模式,那么Java就是通过所谓的event listeners实现事件功能的方式。没有理由为什么这种模式不能在C#中采用,并且在某些情况下它可以提供比使用事件和委托更优雅的解决方案,尤其是当可能存在通常由感兴趣方订阅的若干协调事件时。

另一个选项是从DependencyObject派生并实现DependencyProperties,以获取内置的更改通知并针对WPF进行了优化。我倾向于不采用这种方式,因为我不喜欢具有特定基类的要求,但是有一些很好的论据,为什么它有时是正确的选择,实际上一些MVVM框架甚至将它用作变更通知的基础对于ViewModel类也是如此。