2008-08-28 34 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的委託和事件概念處理大部分「繁重工作」,並降低了主體和觀察者之間的耦合程度。