【问题标题】:In C#, isn't the observer pattern already implemented using Events?在 C# 中,观察者模式不是已经使用事件实现了吗?
【发布时间】:2008-08-28 11:36:52
【问题描述】:

在阅读了 Head First Design Patterns 一书并使用了许多其他设计模式之后,我试图理解观察者模式。这不是已经使用 .NET Framework 中的事件实现了吗?

【问题讨论】:

    标签: c# .net design-patterns


    【解决方案1】:

    是的,是的。观察者模式也称为发布/订阅模式,这正是事件允许您执行的操作。

    【讨论】:

    【解决方案2】:

    我会说是的,基于他对 Delphi 的经验,Anders Heljsberg 的意图是让观察者模式成为 C# 事件的一流语言功能。 Anders 在Software Engineering Radio 的精彩采访中明确了这一和其他设计意图。

    【讨论】:

      【解决方案3】:

      是的,是一样的。

      注意:如果您真的想了解事件,我建议您学习观察者模式并自己实施一段时间。一旦你完全理解了它,就不要自己动手了,而是使用专业且有据可查的实现,除非你真的需要这样做。

      【讨论】:

        【解决方案4】:

        没错,事件是观察者模式的一种实现。不过,我读过一些人的讨论,他们仍然在编写自己的代码,以给予他们更大的灵活性,或者只是为了避免引发事件的语法。

        【讨论】:

          【解决方案5】:

          是的,但是显式地对观察者模式进行编程,因此不使用委托和事件可以使您的代码更容易调试。

          考虑差异:

          public void NotifyObservers()
          {
              foreach(Product product in ProductList)
              {
                  if (product is IProductObserver)
                  {
                         product.Update(this)
                  }
              }
          }
          

          这里非常清楚列表中的哪些产品会收到更改通知。在调试时,您可以检查 ProductList...

          通过使用委托和事件,找出实际“订阅”了多少“委托”来处理事件可能会更加麻烦。

          【讨论】:

          • 我不喜欢鼓励开发人员重新实现而不是重用的想法。
          • 你能详细说明一下吗?我的意思是,在这两种情况下,开发人员都必须实现该模式。我之所以把它作为一个明确的例子,基本上是因为我同意 Dinah 的观点,如果你真的想了解观察者模式,最好先自己构建它,然后再去参加活动。
          【解决方案6】:

          大多数现代语言都对某些设计模式提供原生支持。有人认为,语言本身支持的模式越多,不需要显式地实现它们,语言就越好,而 Lisp 在这方面非常出色。 Jeff 也有something to say 的相关信息。

          【讨论】:

            【解决方案7】:

            Microsoft 本身声明使用事件和委托是应用观察者模式的 c# 方式。 使用事件和委托的一些基本命名约定,他们将自己的模式命名为“事件模式”,这与经典的观察者模式相比提供了一些额外的优势。

            “事件模式”在 MSDN 库中的“探索观察者设计模式”一文中进行了描述。

            Reference MSDN Article

            基于事件和委托,FCL 广泛使用了观察者模式。 FCL 的设计者充分认识到这种模式的内在力量,将其应用于整个框架的用户界面和非 UI 特定功能。然而,这种用法与基本的观察者模式略有不同,框架团队将其称为事件模式。通常,此模式表示为事件通知过程中涉及的委托、事件和相关方法的正式命名约定。 Microsoft 建议所有使用事件和委托的应用程序和框架都采用这种模式,尽管 CLR 或标准编译器中没有强制执行

            基于对观察者模式的研究,很明显这种模式提供了一种理想的机制来确保应用程序中对象之间的清晰边界,而不管它们的功能(UI 或其他)。虽然通过回调实现相当简单(使用 IObserver 和 IObservable 接口),但委托和事件的 CLR 概念处理了大部分“繁重的工作”,并降低了主体和观察者之间的耦合程度。

            【讨论】:

              【解决方案8】:

              不,它们实现相同的意图,但是它们不同。 我想说的是,观察者模式是一种过度设计,旨在实现您可以通过函数式编程轻松实现的目标,而 .NET 事件使用函数式编程来实现相同的目标。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-10-28
                • 1970-01-01
                • 1970-01-01
                • 2011-12-21
                • 1970-01-01
                • 2015-01-30
                • 1970-01-01
                • 2010-11-04
                相关资源
                最近更新 更多