2008-08-28 35 views

回答

24

是的。观察者模式也被称为发布/订阅模式,这正是事件允许你做的事情。

+1

一个稍微不同的回答这个问题,看http://stackoverflow.com/questions/1023329/observer-pattern-implemented-in-c-sharp-with-delegates – kmote 2012-02-14 14:25:14

4

这是正确的,事件是观察者模式的实现。尽管如此,我还是阅读了一些讨论,他们仍然自己写,为他们提供更多的灵活性,或者只是为了避免事件发生的语法。

7

是的,它是一样的。

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

21

我会说是的,这是Anders Heljsberg基于他在Delphi中的经验使观察者模式成为C#事件的一流语言特性。安德斯在Software Engineering Radio的优秀采访中表达了这一设计意图和其他设计意图。

0

大多数现代语言都支持某些设计模式。有人认为,语言越好,它们本身支持的模式就越多,而不需要明确地实现它们,Lisp在这方面非常出色。杰夫也有something to say

4

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

考虑差异:

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

这是很清楚什么样的产品列表中得到通知的变化。在调试时,您可以检查ProductList ...

使用委托和事件可以更加麻烦地找出有多少“委托”实际上“订阅”来处理事件。

+0

我不喜欢鼓励开发者重新实现而不是重用的想法。 – 2008-09-24 05:44:08

-2

不,他们达到相同的意图,但他们是不同的。 我会说观察者模式对于实现某些功能性编程可以轻松实现的功能来说是一种过度设计的攻击,并且.NET事件使用函数式编程来实现相同的目标。

0

Microsoft本身使用事件和委托是使用Observer模式的c#方式。 使用一些基本的命名约定为事件和代表他们命名他们自己的模式“事件模式”它完全相同的东西提供了一些额外的优势,比传统的观察者模式

“事件模式”是MSDN Library中里面的“探索Observer设计模式”文章描述。

Reference MSDN Article

基于事件和委托,FCL中使用了观察者模式相当广泛。 FCL的设计人员充分认识到这种模式的内在力量,将其应用于整个框架的用户界面和非UI特定功能。然而,这种用法在基础Observer模式上略有变化,框架团队称之为事件模式。一般来说,这种模式表示为事件通知过程中涉及的委托,事件和相关方法的正式命名约定。 Microsoft建议利用事件和委托的所有应用程序和框架采用这种模式,虽然在CLR或标准编译器

在此基础上检查Observer模式的不执行,应当显而易见,这种模式提供一个理想的机制,以确保应用程序中的对象之间的清晰界限,而不管它们的功能(用户界面或其他)。尽管通过回调(使用IObserver和IObservable接口)实现起来相当简单,但CLR的委托和事件概念处理大部分“繁重工作”,并降低了主体和观察者之间的耦合程度。