簡體   English   中英

用事件實現觀察者模式

[英]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);

在給定BarBazvoid方法定義委托。 因此,如果您有以下類的實例:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM