摘要:使用字符串定義事件類型,容易產生拼寫錯誤并且自動完成不能很好的工作。消息和事件的目標之間并沒有關系。通過命名規范來避免消息被錯誤的訂閱者攔截。細粒度的控制每個監聽器和事件類型。傾向于使用組合而不是繼承。與大多數人使用的不同。
原文鏈接:Comparison between different Observer Pattern implementations
下面的比較只是關于訂閱、發布事件以及刪除事件監聽器的一些基本特性。主要是基于各種基本概念實現上的不同和它們使用上的優缺點,而不是可用的特性。有些被標記為缺點的部分可以通過“好的實現”或則“hack”來避免,但是通常情況下,這些缺點都是存在的。
所有的實現都基于一種設計模式(Observer)完成了相同的任務,他們雖然有很多共同點,但運行方式上卻有些許不同。本文主要是為了幫助你選擇哪種實現最適合你的工作流以及你要解決的問題種類。
Event Emitter/Target/Dispatcher所有派發自定義事件的對象都需要繼承自EventEmitter/EventTarget/EventDspatcher或者實現特定的接口。
使用字符串定義事件類型。
DOM2/DOM3 Events就是基于這樣的模式。
代碼示例myObject.addEventListener("myCustomEventTypeString", handler); myObject.dispatchEvent(new Event("myCustomEventTypeString")); myObject.removeEventListener("myCustomEventTypeString", handler);優點
對target object具有完全的控制,確保只監聽特定target派發的事件。
能夠派發任意的事件類型而不用修改target object。
每一種target/object/event都使用相同的方法。
代碼容易理解。
事件的target通常都是object本身,這使得事件冒泡更有邏輯性。
流行。
缺點傾向于使用繼承而不是組合。
使用字符串定義事件類型,容易產生拼寫錯誤并且IDE自動完成不能很好的工作。
Event handler通常只接受一個參數(Event Object)。
如果想傳遞額外的數據,必須創建一個實現了特定接口的自定義Event對象或者擴展一個基本的Event對象,這個過程通常是繁瑣不便的。
Publish / Subscribe (pub/sub)
使用同一個對象向多個訂閱者廣播消息。
并不是必要條件,但大多數實現都使用一個靜態的集中的對象作為廣播者。
使用字符串定義事件類型。
消息和事件的目標之間并沒有關系。
代碼示例globalBroadcaster.subscribe("myCustomEventTypeString", handler); globalBroadcaster.publish("myCustomEventTypeString", paramsArray); globalBroadcaster.unsubscribe("myCustomEventTypeString", handler);優點
任意對象都能訂閱/發布任何事件類型。
輕量級。
容易使用/實現。
缺點任意對象都能訂閱/發布任何事件類型(是的,這既是優點也是缺點)。
使用字符串定義事件類型。
容易出錯。
沒有自動完成(除非將value保存為變量/常量)。
通過命名規范來避免消息被錯誤的訂閱者攔截。
Signals每種事件類型都有自己的控制器。
事件類型不依賴于字符串。
代碼示例myObject.myCustomEventType.add(handler); myObject.myCustomEventType.dispatch(param1, param2, ...); myObject.myCustomEventType.remove(handler);優點
不依賴于字符串。
自動完成能正常工作。
派發或監聽一個不存在的事件類型會拋出錯誤(能夠更早的發現錯誤)。
不需要創建常量來存儲字符串值。
細粒度的控制每個監聽器和事件類型。
每個signal都是一個特定的目標/容器。
容易定義對象派發的signal。
傾向于使用組合而不是繼承。
別和原型鏈混淆了。
缺點不能派發任意類型的事件。(這在大多數情況下也是個優點)
每個事件類型都是個對象成員。(這在大多數情況下也是個優點)
如果有很多事件類型的話,易導致命名空間混亂。
不會將事件類型和目標對象傳遞給callback使得很難使用通用的handler(工作于多個事件類型和目標)。
與大多數人使用的不同。
結論就像生活中的大多數東西一樣,每種解決方案都有它的優點和缺點。決定哪種方式最適合取決于你。我希望本文能在你做決定時幫助到你。再一次,沒有解決方案是萬能的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78573.html
摘要:總結一下從表面上看觀察者模式里,只有兩個角色觀察者被觀察者而發布訂閱模式,卻不僅僅只有發布者和訂閱者兩個角色,還有第三個角色經紀人存在。參考鏈接觀察者模式發布訂閱模式 做了這么長時間的 菜鳥程序員 ,我好像還沒有寫過一篇關于設計模式的博客...咳咳...意外,純屬意外。所以,我決定,從這一刻起,我要把設計模式在從頭學習一遍,不然都對不起我這 菜鳥 的身份。那這次,就從觀察者模式開始好啦...
摘要:總結一下從表面上看觀察者模式里,只有兩個角色觀察者被觀察者而發布訂閱模式,卻不僅僅只有發布者和訂閱者兩個角色,還有第三個角色經紀人存在。參考鏈接觀察者模式發布訂閱模式 做了這么長時間的 菜鳥程序員 ,我好像還沒有寫過一篇關于設計模式的博客...咳咳...意外,純屬意外。所以,我決定,從這一刻起,我要把設計模式在從頭學習一遍,不然都對不起我這 菜鳥 的身份。那這次,就從觀察者模式開始好啦...
摘要:的設計模式世界頂級足球射門錦集。重構敏捷軟件開發設計模式解析一場場最精彩的足球比賽。但不屬于種設計模式之一。代理設計模式代理模式,為其他對象提供一種代理以控制對這個對象的訪問。 前言 編程是一門技術,更是一門藝術。如果想成為一名更優秀的軟件設計師,了解優秀軟件設計的演變過程比學習優秀設計本身更有價值,因為設計的演變過程中蘊藏著大智慧。學習設計模式,重要的不是你將來會不會用得到這些模式,...
摘要:作為整個集群的主節點,負責響應所有對狀態變更的請求。選舉是最重要的技術之一,也是保障分布式數據一致性的關鍵所在。這是由于半數以上投票通過決定的。另外需要注意的是,和構成集群的法定人數,也就是說,只有他們才參與新的選舉響應的提議。 showImg(https://segmentfault.com/img/remote/1460000016733126); 前言 提到ZooKeeper,相...
摘要:作為整個集群的主節點,負責響應所有對狀態變更的請求。選舉是最重要的技術之一,也是保障分布式數據一致性的關鍵所在。這是由于半數以上投票通過決定的。另外需要注意的是,和構成集群的法定人數,也就是說,只有他們才參與新的選舉響應的提議。 showImg(https://segmentfault.com/img/remote/1460000016733126); 前言 提到ZooKeeper,相...
閱讀 2654·2023-04-25 15:22
閱讀 2824·2021-10-11 10:58
閱讀 1045·2021-08-30 09:48
閱讀 1851·2019-08-30 15:56
閱讀 1730·2019-08-30 15:53
閱讀 1089·2019-08-29 11:16
閱讀 1048·2019-08-23 18:34
閱讀 1638·2019-08-23 18:12