2012-09-21 78 views
15

我目前正在讀http://addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascript是否使用介體模式推薦?

我理解的調解模式,作爲某種對象的其中規定了發佈和訂閱功能。

通常我設置的對象已經提供了subscribe(),publish()方法。具體對象擴展此基礎對象,以便subscribe()和publish()始終註冊爲原型屬性。

據我所知,調解器模式用於將發佈 - 訂閱 - 方法添加到對象。

這種做法的好處是什麼?提供一個具有發佈和訂閱功能的基礎對象,而不是讓調解員在施工中建立起來,這不是一種更好的做法嗎?

還是我理解了介體模式錯了?

問候

回答

19

正如我已經從類似的帖子前段時間得知:

  • 調解模式,提供了模塊使用標準的API。

    讓我們有一個例子:

    您應用的成千上萬的模塊在很大程度上依賴於jQuery的$.post。如果您的公司突然發生許可問題,並決定轉移到例如MooTools或YUI,您是否會查找使用$.post的所有代碼並將其替換爲MooTools.post之類的代碼?

    中介模式通過標準化API解決了這個危機。模塊知道的是,您的中介具有可以進行AJAX post的post函數,而不管使用了哪個庫。

    //module only sees MyMediator.post and only knows that it does an AJAX post 
    //How it's implemented and what library is used is not the module's concern 
    
    jQuery.post -> MyMediator.post -> module 
    MooTools.post -> MyMediator.post -> module 
    YUI.post  -> MyMediator.post -> module 
    
  • 調解員作爲intermodule通信的「中間人」。

    新手JS開發中的一個問題是模塊相互依賴。這是當:

    MyClassA.something = MyClassB.method(); 
    MyClassB.something = MyClassA.method(); 
    

    但是,如果有什麼事情是錯的MyClassB和開發商拿出來構建的。您是否會尋找並去掉MyClassA中使用MyClassB的所有代碼,以便它不會由於MyClassB的缺失而中斷?

    中介模式的publishsubscribe模式通過使模塊訂閱事件而不是直接與其他模塊接口來解決此問題。介體充當事件發佈時觸發的回調/訂閱的集合。

    此「匿名」訂閱導致部分鬆散耦合。模塊仍然需要知道要聽的模塊或至少一組要聽的事件,但它們之間的連接方式不會導致任何一個事件被取出時發生破壞。他們所知道的只是他們訂閱了該事件,並且會在事件發生時執行 - 無論是誰觸發它,它是否觸發,或觸發器是否存在。

+0

是否調解員註冊的發佈和訂閱功能,在構造一個對象?爲什麼我不能爲所有事件使用全局中介?使用例如requirejs時,中介是否必須是單身人士? – bodokaiser

+1

@kyogron是的,調解者就像一個收集訂閱並在被調用時觸發它們的單身人士。但有理由說你會有多個調解員。爲了清楚起見,我建議你觀看這個[Nicholas Zakas的視頻](http://www.youtube.com/watch?v=vXjVFPosQHw)關於這個主題(他有幻燈片和圖表)以及[KernelJS library](http ://alanlindsay.me/kerneljs/)做這種模式。 – Joseph

+1

@JosephtheDreamer在你的例子中,我覺得它是一個比中介更像門面模式嗎?我錯過了什麼嗎? – hguser

2

您可以在不使用事件(pub/sub)的情況下實現中介。 在複雜/複雜的流程中,調試或推理純粹由事件驅動的代碼可能具有挑戰性。

有關如何創建沒有發佈/訂閱調解員的例子,你可以在我的項目jQueryMediator看看: https://github.com/jasonmcaffee/jQueryMediator