成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[翻譯] 比較不同Observer模式的實(shí)現(xiàn)

Hegel_Gu / 2804人閱讀

摘要:使用字符串定義事件類型,容易產(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

相關(guān)文章

  • 設(shè)計(jì)模式 -- 觀察者模式

    摘要:總結(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)始好啦...

    chengtao1633 評(píng)論0 收藏0
  • 設(shè)計(jì)模式 -- 觀察者模式

    摘要:總結(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)始好啦...

    makeFoxPlay 評(píng)論0 收藏0
  • Java設(shè)計(jì)模式學(xué)習(xí)總結(jié)

    摘要:的設(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ì)用得到這些模式,...

    songze 評(píng)論0 收藏0
  • 同是ZooKeeper,你和架構(gòu)師理解差在哪里?

    摘要:作為整個(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,相...

    sixgo 評(píng)論0 收藏0
  • 同是ZooKeeper,你和架構(gòu)師理解差在哪里?

    摘要:作為整個(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,相...

    IntMain 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<