在閱讀Head First Design Patterns書籍並使用大量其他設計模式之後,我試圖瞭解Observer模式。這不是已經使用.NET Framework中的事件實現嗎?在C#中,是不是已經使用事件實現的觀察者模式?
回答
是的。觀察者模式也被稱爲發佈/訂閱模式,這正是事件允許你做的事情。
這是正確的,事件是觀察者模式的實現。儘管如此,我還是閱讀了一些討論,他們仍然自己寫,爲他們提供更多的靈活性,或者只是爲了避免事件發生的語法。
是的,它是一樣的。
注意:如果您真的想了解事件,我建議您學習觀察者模式並自行實施一段時間。一旦你完全理解了它,就不要自己動手做,除非你真的需要做別的事情,否則你應該使用專業且有據可查的實現。
我會說是的,這是Anders Heljsberg基於他在Delphi中的經驗使觀察者模式成爲C#事件的一流語言特性。安德斯在Software Engineering Radio的優秀採訪中表達了這一設計意圖和其他設計意圖。
大多數現代語言都支持某些設計模式。有人認爲,語言越好,它們本身支持的模式就越多,而不需要明確地實現它們,Lisp在這方面非常出色。傑夫也有something to say。
是的,但是顯式編程觀察者模式,因此不使用委託和事件可以更容易地調試代碼。
考慮差異:
public void NotifyObservers()
{
foreach(Product product in ProductList)
{
if (product is IProductObserver)
{
product.Update(this)
}
}
}
這是很清楚什麼樣的產品列表中得到通知的變化。在調試時,您可以檢查ProductList ...
使用委託和事件可以更加麻煩地找出有多少「委託」實際上「訂閱」來處理事件。
我不喜歡鼓勵開發者重新實現而不是重用的想法。 – 2008-09-24 05:44:08
不,他們達到相同的意圖,但他們是不同的。 我會說觀察者模式對於實現某些功能性編程可以輕鬆實現的功能來說是一種過度設計的攻擊,並且.NET事件使用函數式編程來實現相同的目標。
Microsoft本身使用事件和委託是使用Observer模式的c#方式。 使用一些基本的命名約定爲事件和代表他們命名他們自己的模式「事件模式」它完全相同的東西提供了一些額外的優勢,比傳統的觀察者模式。
「事件模式」是MSDN Library中裏面的「探索Observer設計模式」文章描述。
基於事件和委託,FCL中使用了觀察者模式相當廣泛。 FCL的設計人員充分認識到這種模式的內在力量,將其應用於整個框架的用戶界面和非UI特定功能。然而,這種用法在基礎Observer模式上略有變化,框架團隊稱之爲事件模式。一般來說,這種模式表示爲事件通知過程中涉及的委託,事件和相關方法的正式命名約定。 Microsoft建議利用事件和委託的所有應用程序和框架採用這種模式,雖然在CLR或標準編譯器
在此基礎上檢查Observer模式的不執行,應當顯而易見,這種模式提供一個理想的機制,以確保應用程序中的對象之間的清晰界限,而不管它們的功能(用戶界面或其他)。儘管通過回調(使用IObserver和IObservable接口)實現起來相當簡單,但CLR的委託和事件概念處理大部分「繁重工作」,並降低了主體和觀察者之間的耦合程度。
- 1. 實現觀察者模式
- 2. 使用winforms實現觀察者模式
- 3. 實現C++ -to-lua觀察者模式?
- 4. 在C#中使用委託實現的觀察者模式?
- 5. 在Magento中實現事件觀察者
- 6. 使用GreenDao實現事件監聽器/觀察者模式
- 7. 是否可以使用REST API實現觀察者模式
- 8. 是否值得在PHP中實現觀察者模式?
- 9. 實現觀察者模式的片段
- 10. 通過RMI實現觀察者模式
- 11. 如何在C++中實現觀察者模式
- 12. Ninject/NHibernate事件+觀察者模式
- 13. 自定義事件(觀察者模式)
- 14. 在Delphi中實現觀察者模式的最佳方式
- 15. 觀察者模式 - 觀察者創建
- 16. 觀察者模式Java - 使用線程的多個觀察者
- 17. 使用Spring依賴注入的觀察者模式實現
- 18. 觀察者模式的線程化實現 - C++
- 19. 當觀察者希望觀察不同的項目時,實現觀察者模式
- 20. 如何實現觀察者模式以在asp.net中使用用戶控件
- 21. 在.NET中實現觀察者模式的類的名稱?
- 22. C中的觀察者模式#
- 23. 仍然是觀察者模式?
- 24. 如何在C++中實現觀察者模式,在JNI中調用Java方法
- 25. 觀察者模式
- 26. 如何使用Java RMI實現觀察者模式?
- 27. 使用了weak_ptr來實現觀察者模式
- 28. 如何使用boost :: signals來實現觀察者模式?
- 29. C++如何使用TR1實現觀察者模式模板基類
- 30. 如何應用觀察者模式如果觀察者也是主體
一個稍微不同的回答這個問題,看http://stackoverflow.com/questions/1023329/observer-pattern-implemented-in-c-sharp-with-delegates – kmote 2012-02-14 14:25:14