2011-06-22 132 views
43

我總是發現觀察者模式與通常的事件驅動方法幾乎相似。實際上,我幾乎相信它們實際上是指同一事物的不同名稱。它們都使用類似的概念來作爲一個監聽器,甚至在實現中,它們幾乎是一樣的,那就是有一個回調方法/函數來執行一個動作。這至少在Java中。觀察者模式和事件驅動方法的區別

在其他語言中說,Actionscript/Flex的事件更加用戶友好,可能看起來不像觀察者模式定義的那樣。但是,這些概念聽起來都是一樣的。

但這是真的嗎?觀察者模式與通常的事件驅動編程風格相同嗎?

+0

[Observer模式如何與事件驅動模型不同?](http://stackoverflow.com/questions/807778/how-is-the-observer-pattern-different-from-an-event驅動模型) – nawfal

回答

28

觀察者模式是一個非常特殊的例子。事件驅動可以意味着任何事情。在大多數觀察者模式實現中,觀察者是觀察觀察者的對象。當觀察者改變時,調用觀察者的一種方法。嚴格地說,這不是一個「事件」。這意味着:對觀察者的各種不同的行爲,通常導致在觀察者中調用不同的方法。在該方法中,「what」變化的語義是。 在事件驅動系統中,基本上有一個消費對象/方法和消息,事件中發生了什麼變化或發生了什麼。這可以是任何事情,並不限於觀察事物的想法!這意味着:在事件驅動系統中,您可以通過添加新的事件類型來獲得新的語義。在觀察者模式中,您通常通過向Observer類添加方法來添加語義。然而,沒有人阻止你實現一個Observer作爲ChangeEvents的特殊Listers。

+89

讀這個讓我更加困惑。 – crush

+0

@crush我可以在Java中添加一個更清晰的例子,在EDT中,EDT是一個事件總線,它捕獲系統發送的所有事件,讓我們說一個按鈕點擊,EDT會派發點擊事件,按鈕會捕捉它 - 請注意,按鈕的父容器也可能捕獲事件,而按鈕本身可能會捕獲其他類型的事件 - 這是事件模式的一個示例。現在該按鈕已經註冊了偵聽器,這個偵聽器已經通過傳遞這個事件的按鈕得到通知和調用,這個註冊是一個觀察者模式的例子 – DrAhmedJava

+1

因此,事件就像沒有預期接收者的廣播,而觀察者模式就像多播,其中接收者是直接的從可觀察到的信號觀察? – Gulshan

0

是的,它們是基本相同的。

事件就像某些語言的「內置」觀察者模式模板。

因此,您不會真的以支持事件的語言實現觀察者模式,因爲它們已經提供了您正在尋找的內容。
另一方面,您可以使用觀察者模式編寫缺少事件的語言的事件驅動。

+0

我會說Observer/Pubsub模式和直接事件之間的一個很大的區別是,大量使用事件可以引入系統中對象之間非常緊密的耦合,而觀察者或中心作爲中介更鬆散的耦合 - 訂閱特定主題的對象不需要對發佈主題的對象有任何「知識」。 – natlee75

6

第1號差異可能是,事件系統總是有一個eventdispatchthread,它將觀察者與觀察者分開,所以事件可能不會立即到達觀察者。雖然真正的observables直接調用觀察者方法,但事件驅動的observable將其事件放入事件隊列中。然後EDT將這些事件傳遞給註冊的聽衆。

10

當存在在發佈服務器或主題的狀態變化,

  • 事件驅動架構(是一個消息驅動架構),負責傳送消息給訂戶,異步。

  • 觀察者模式(是一種軟件設計模式),負責命令訂戶做某事,同步。

1

我已經搜索了一下這個相同的問題。 對於這個線程,我從Angel O'Sphere找到了關於「什麼語義」的點,並指出了Spacerat對「調度程序」的幫助。

這兩點是我的理解,區分Even-Driver和Observer Pattern。至少從規範的解釋來看,「觀察者模式」通常表示一旦「主題」發生變化時的即時廣播,並且通過調用由訂閱者或監聽者提供的接口來實現「調度」。而對於事件驅動,在「主題」和「觀察者」之間總是存在另一層,無論是調用「調度器」還是使用「事件隊列」,這提供了「延遲」處理以減少CPU使用率,接口取決於不同的事件類型

0

兩者的基本區別在於耦合和同步行爲如果我們堅持觀察者模式,我們說只有一個信號源並且它是同步的,而另一方面是事件,我們解耦了雙方獨立工作,並且同時在沒有任何代碼改變的情況下,有可能在未來有多個事件源,事件可以幫助我們接受異步設計,所有的Reactive編程庫都爲事件驅動提供了很好的支持設計。

0

Wikipedia

觀察者模式是一種軟件設計模式,其中一個對象, 稱爲主題,保持其家屬的名單,被稱爲 觀察員,並自動通知它們中的任何狀態變化, 通常通過調用他們的一種方法。

它主要用於實現分佈式事件處理系統,在 「事件驅動」軟件。大多數現代語言如Java和C# 都內置了實現觀察者模式 組件的「事件」結構,以便於編程和簡化代碼。

觀察者模式有點抽象和理論。事件是一個(通常內置的)實現,然而正如天使的回答所指出的事件除了觀察者模式中的嚴格定義之外,事件往往能夠用於其他一些情況。