[英]Implementing observer pattern with events
我正在開發一個Silverlight應用程序,我過度使用了觀察者模式。 在我的實現中,我創建了兩個接口IObservable<T>
和IObserver<T>
。 前者包含將觀察者附加到觀察者的方法。 后者有一個方法Notify(IObservable<T> observable, ...)
,當observable改變了它的狀態時,observable通過observer.Notify(this, ...)
傳遞自身作為參數。
現在我偶然發現了“事件”,對我來說,這似乎就像是觀察者模式的一個實現,只是代表而不是前面提到的Notify
-method。 那正確嗎?
我不太了解代表,並且不想花費數小時來重寫我的代碼,只是為了最終得到與它已經做同樣事情的代碼。 另一方面,事件可能優於基於接口的觀察者模式。 我錯過了什么嗎?
事件是觀察者模式的實現。
事件被實現為引發通風口時要調用的方法列表。
代理是方法引用:與Java相比,C#提供了一種引用方法的方法。
使用事件比自己實現觀察者模式更好。 但事件提供了一種非常通用的方式,並且在許多情況下針對任務進行了高度優化,從而提供了一種更有效,更方便的方式來組織它。
委托由預期方法的簽名定義。 例如:
public delegate void FooMethod (Bar x, Baz y);
在給定Bar
和Baz
為void
方法定義委托。 因此,如果您有以下類的實例:
public class Qux {
public void Method (Bar x, Baz y) {
//do something
return null;
}
}
然后你可以參考方法:
Qux q = new Qux();
FooMethod fm = q.Method;
因此, event
是具有相同簽名的delegate
列表:
您將事件定義為:
private event FooMethod SomeEvent;
您可以使用+=
運算符添加delegate
(偵聽器):
SomeEvent += q.Method;
通過-=
運算符刪除委托並使用以下命令調用事件:
SomeEvent(new Bar(), new Baz());
好像你調用一個執行調度的方法。
通過調用該event
,將按注冊順序調用所有已注冊的delegate
。
注意 :通過調用
SomeEvent(new Bar(), new Baz());
這並不意味着每個代理都會收到new
實例:實例首先構建並在所有代理調用中共享 。
結論 :我認為C#設計師在介紹觀察者模式方面做得很好,因為程序員不再負責自己正確編程。 此外,事件易於理解並使用方便的語法。 但在特殊情況下,程序員可能需要自己實施觀察者 。 但這些都是非常罕見的場合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.