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