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

有帮助吗?

解决方案

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

其他提示

我想说是的,Anders Heljsberg 的目的是根据他使用 Delphi 的经验,使观察者模式成为 C# 中事件的一流语言功能。安德斯在一次精彩的采访中明确了这一点和其他设计意图 软件工程广播.

是的,它是相同的。

一张纸条:如果你真的想理解事件,我建议学习观察者模式并自己实现一段时间。一旦您完全理解它,请停止自己动手,并使用专业且有据可查的实现,除非您确实需要这样做。

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

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

考虑一下差异:

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

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

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

大多数现代语言都对某些设计模式提供本机支持。有人认为,语言本身支持的模式越多越好,而无需显式实现它们,而 Lisp 在这方面非常出色。杰夫有 有话要说 关于这一点,也是。

微软 它本身指出,使用事件和委托是应用观察者模式的 C# 方式。对事件和委托使用一些基本的命名约定,他们将自己的模式命名为 《事件模式》 它做完全相同的事情,提供比经典的一些额外的优势 观察者模式.

《事件模式》 在MSDN Library里面有描述“探索观察者设计模式“ 文章。

参考MSDN文章

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

根据对观察者模式的检查,很明显该模式提供了一种理想的机制来确保应用程序中的对象之间的清晰边界,无论其功能如何(UI 或其他)。虽然通过回调(使用 IObserver 和 IObservable 接口)实现相当简单,但委托和事件的 CLR 概念处理了大部分“繁重工作”,并降低了主体和观察者之间的耦合级别。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top