16

私は現在http://addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascriptを読んでいます

メディエーターパターンは、パブリッシュおよびサブスクライブ機能を設定するある種のオブジェクトとして理解しています。

通常、私はすでにメソッドを提供しているオブジェクトを設定していsubscribe()ますpublish()。具象オブジェクトは、このベースオブジェクトを拡張して、subscribe()publish()が常にプロトタイプ属性として登録されるようにします。

私が正しく理解しているように、メディエーターパターンは、オブジェクトにpublish-subscribe-methodsを追加するために使用されます。

この練習の利点は何ですか?構築時にメディエーターをセットアップさせるよりも、ベースオブジェクトにパブリッシュおよびサブスクライブ機能を提供する方が良い方法ではありませんか?

または、メディエーターパターンが間違っていることを理解しましたか?

4

2 に答える 2

20

私がしばらく前に同様の投稿から学んだこととして:

  • メディエーターパターンは、モジュールが使用するための標準APIを提供します。

    例を見てみましょう:

    アプリの何千ものモジュールは、jQueryに大きく依存しています$.post。突然、あなたの会社でライセンスの問題が発生し、たとえばMooToolsやYUIに移行することにした場合、それらを使用するすべてのコードを探して、次の$.postようなものに置き換えますMooTools.postか?

    メディエーターパターンは、APIを正規化することでこの危機を解決します。モジュールが知っていることは、メディエーターには、使用されたライブラリに関係なくAJAX投稿を実行できる投稿機能があるということです。

    //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
    
  • メディエーターは、モジュール間通信の「仲介者」として機能します。

    初心者のJS開発における1つの問題は、モジュールが相互に依存している場合です。そのとき:

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

    しかし、何かが間違っていMyClassBて、開発者がそれをビルドから削除した場合はどうなりますか。不在のために壊れないように、MyClassAその使用法のすべてのコードを探して取り除きますか?MyClassBMyClassB

    メディエーターパターンpublishsubscribeパターンは、モジュールを他のモジュールと直接インターフェースするのではなく、イベントにサブスクライブさせることでこれを解決します。メディエーターは、イベントが公開されたときに発生するコールバック/サブスクリプションのコレクションとして機能します。

    この「匿名」のサブスクライブにより、部分的な緩い結合が発生します。モジュールは、どのモジュールをリッスンするか、または少なくとも一連のイベントをリッスンするかを知る必要がありますが、モジュールのいずれかが取り出されても破損しないように接続されています。彼らが知っているのは、イベントをサブスクライブし、そのイベントが発生したときに実行されることだけです。誰がイベントを発生させたか、まったく発生しなかったか、トリガーが存在するかどうかは関係ありません。

于 2012-09-21T16:38:06.770 に答える
3

イベント(pub / sub)を使用せずにメディエーションを実現できます。複雑で洗練されたフローでは、純粋にイベント駆動型のコードをデバッグしたり、推論したりするのが難しい場合があります。

pub / subなしでメディエーターを作成する方法の例については、私のプロジェクトjQueryMediatorをご覧ください: https ://github.com/jasonmcaffee/jQueryMediator

于 2013-11-18T19:38:03.693 に答える