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