【问题标题】:Best pattern for change notification (events or delegates)更改通知的最佳模式(事件或委托)
【发布时间】:2010-11-19 00:44:59
【问题描述】:

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

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

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

对于这种情况,最优雅的模式是什么?还有其他我没有想到的方法吗?

【问题讨论】:

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


    【解决方案1】:

    如果您将有多个观察者,则需要事件或 MultipleDelegates。如果您只有一个观察者,并且想要强制执行,那么委托就足够了。然而,就哪个最好而言,恕我直言,我会说这个活动更加灵活,并且非常适合这种模式。 ObservableCollection 和 INotifyPropertyChanged 是基于事件的实现。顺便说一句,为 tbischel +1 以获取对这些类的引用。

    【讨论】:

      【解决方案2】:

      此场景有两种内置模式。

      首先,您可以实现INotifyPropertyChanged 接口。如果您想通知演示者集合中对象本身属性的更改,这会更好。 (或源对象本身,如果那是发生变化的地方)。

      第二个是向您的演示者传递一个包含您的对象的ObservableCollection。如果您想通知演示者某个项目已从集合中添加或删除,这会更好。两者都是任何订阅者都可以挂钩的事件驱动模型。


      编辑:底层模式是"Observer" 模式...如果需要,您可以推出自己的版本,详细信息已记录下来。

      【讨论】:

      • 详细地说,如果您实现 INotifyPropertyChanged,那么当您的类包含在 IBindingList 或 ObservableCollection 中时,您的类将准备好与许多 WindowsForms 或 WPF 控件进行数据绑定。如果没有额外的工作,代表不会启用此功能
      • 感谢您的回答,如果您主要使用 wpf/windows 表单,这些集合很有用。不过,我对这里的基本模式更感兴趣
      • 它们是“观察者”设计模式的特定实现......虽然您可以免费更新在 Winforms 和 WPF 中绑定到的控件,但它们在非 UI 情况下仍然非常有用。
      【解决方案3】:

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

      另一个选项也是从 DependencyObject 派生并实现 DependencyProperties 以获得内置的并针对 WPF 优化的更改通知。我倾向于不走这条路,因为我不喜欢拥有特定基类的要求,但有一些很好的论据说明为什么它有时是正确的选择,事实上一些 MVVM 框架甚至将它用作更改通知的基础也适用于 ViewModel 类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-05
        • 2017-07-07
        • 2019-09-20
        相关资源
        最近更新 更多