代码之家  ›  专栏  ›  技术社区  ›  123Developer

观察者设计模式和事件委托模型

  •  4
  • 123Developer  · 技术社区  · 15 年前

    观察者设计模式似乎是通过其事件委托模型内置于C中的。我有什么理由用经典的方式来实现它吗?

    当做
    123显影剂

    6 回复  |  直到 15 年前
        1
  •  6
  •   Reed Copsey    15 年前

    通常,语言中内置的事件模型对于观察者模式是足够的。实际上没有理由用不同的方式实现它,因为您只是在重新创建事件。

    也就是说,很少有人改变“标准”事件模式。例如,我看到过一些情况,人们希望异步引发事件。我通常不建议这样做(我个人认为在订户方面处理得更好),但它仍然可以通过标准的C事件来处理,但会稍微增加事件的变化(使用getInvocationList并异步调用委托)。

        2
  •  3
  •   Derick Bailey    15 年前

    你说得对。观察者模式通过委托在C事件系统中实现。

    您希望使用更接近经典观察器的1原因甚至是聚合以促进域事件和/或复合应用程序体系结构。

    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

        3
  •  2
  •   decyclone    15 年前

    我认为一般来说,我们不应该使用C委托模型来实现观察者模式没有真正的原因。但是,在.NET 4中,他们补充说 IObserver<T> IObservable<T> 实现基于推送的通知系统的接口。因此,我想这是您希望使用接口而不是基于事件的模型的情况之一。

        4
  •  1
  •   Cylon Cat    15 年前

    我同意.NET的事件处理程序可以满足您对观察者模式的大部分需求。但是,您需要注意一些接口,特别是对于Silverlight和WPF。这些是不完整的属性更改和不完整的集合更改。这些规定了Silverlight和WPF对数据绑定所期望的特定模式。此外,还有一个ObservableCollection类实现了inotifyCollectionChanged;这在构建Silverlight和WPF接口时节省了大量的麻烦。

        5
  •  0
  •   Jerod Houghtelling    15 年前

    我同意经典的观察者设计模式在C中被大大简化。我认为有可能存在一些使用经典实现“更安全”的情况。想到的是多线程和公共API。我认为,如果采用经典的方法,单元测试有时会更容易。但是,正如您提到的,现在有一个更简单的快捷方式与C代表。对不起,我没有一个明确的答案,你什么时候必须使用经典模式。

        6
  •  0
  •   Community Mohan Dere    9 年前

    我想看看这篇文章:

    Similar Question on SO

    我特别喜欢乔恩·斯基特的一句话:

    当然。这有点像在问,“我应该实现迭代器模式还是使用foreach和ienumerable?”

    这是对这句老话的回应:

    嗯,事件可以用来实现观察者模式。实际上,使用事件可以看作是观测者模式imho的另一种实现。

    但所选的答案是相当好的和适用的。