在阅读了 Head First Design Patterns 一书并使用了许多其他设计模式之后,我试图理解观察者模式。这不是已经使用 .NET Framework 中的事件实现了吗?
8 回答
是的。观察者模式也称为发布/订阅模式,这正是事件允许您执行的操作。
我会说是的,基于他对 Delphi 的经验,Anders Heljsberg 的意图是使观察者模式成为 C# 事件的一流语言功能。Anders 在Software Engineering Radio的一次精彩采访中清楚地说明了这个和其他设计意图。
是的,它是相同的。
注意:如果你真的想了解事件,我建议学习观察者模式并自己实现一段时间。一旦你完全理解了它,就不要自己做,而是使用专业且有据可查的实现,除非你真的需要这样做。
没错,事件是观察者模式的一种实现。不过,我读过关于仍然编写自己的人的讨论,以给予他们更大的灵活性,或者只是为了避免引发事件的语法。
是的,但是显式地对观察者模式进行编程,因此不使用委托和事件可以使您的代码更容易调试。
考虑差异:
public void NotifyObservers()
{
foreach(Product product in ProductList)
{
if (product is IProductObserver)
{
product.Update(this)
}
}
}
这里很清楚列表中的哪些产品会收到更改通知。在调试时,您可以检查 ProductList ...
通过使用委托和事件,找出实际“订阅”了多少“委托”来处理事件可能会更加麻烦。
大多数现代语言都对某些设计模式提供原生支持。有人认为,语言本身支持的模式越多,不需要显式地实现它们,语言就越好,而 Lisp 在这方面非常出色。杰夫对此也有话要说。
Microsoft本身声明使用事件和委托是应用观察者模式的 c# 方式。使用事件和委托的一些基本命名约定,他们将自己的模式命名为“事件模式”,这与经典的观察者模式相比提供了一些额外的优势。
“事件模式”在 MSDN 库中的“探索观察者设计模式”一文中进行了描述。
基于事件和委托,FCL 相当广泛地使用了观察者模式。FCL 的设计者充分认识到这种模式的内在力量,将其应用于整个框架的用户界面和非 UI 特定功能。然而,这种用法与基本的观察者模式略有不同,框架团队将其称为事件模式。通常,此模式表示为事件通知过程中涉及的委托、事件和相关方法的正式命名约定。Microsoft 建议所有使用事件和委托的应用程序和框架都采用这种模式,尽管 CLR 或标准编译器中没有强制执行
根据对观察者模式的研究,很明显,该模式提供了一种理想的机制来确保应用程序中对象之间的清晰边界,而不管它们的功能(UI 或其他)。尽管通过回调(使用 IObserver 和 IObservable 接口)实现相当简单,但委托和事件的 CLR 概念处理了大部分“繁重的工作”,并降低了主体和观察者之间的耦合程度。
不,它们实现相同的意图,但是它们不同。我会说观察者模式是一种过度设计的黑客攻击,以实现您可以通过函数式编程轻松实现的目标,而 .NET 事件使用函数式编程来实现相同的目标。