2016-04-04 3 views
1

メディエーターのデザインパターンはどのようになりますか? 1つのモジュールは、例えば、相互に通信したい場合、単純に中間関数を呼び出すよりも良いメディエーターパターンと中間関数へのダイレクトコール

var mediator = (function(){ 

var _jobs = {}; 


function _extractedParams(arguments){ 
    var arr = []; 
    if (arguments.length > 1){ 
     for (var i=1; i < arguments.length; i++) arr.push(arguments[i]); 
    } 
    return arr; 
} 


function _defaultSubscribeCallback(){ 
    console.log("_defaultSubscribeCallback()"); 
} 


return { 

    subscribe: function(){ 
     var channel = arguments[0]; 

     if (!_jobs.hasOwnProperty(channel)) _jobs[channel] = []; 

     _jobs[channel].push({ 
      originalParams: _extractedParams(arguments), 
      callback: arguments[1] || _defaultSubscribeCallback 
     }); 

    }, 

    publish: function(){ 
     var channel = arguments[0]; 

     if (!_jobs.hasOwnProperty(channel)) return 0; 

     for (var i=0; i < _jobs[channel].length; i++){ 
      var subscription = _jobs[channel][i]; 

      subscription.callback.apply(this, subscription.originalParams); 
     } 

     return 1; 
    } 

}; 

}()); 

var module1 = (function(){ 

    return { 
     myFunction: function(){ 
      console.log(arguments[0]); //"Hello" 
     } 
    }; 

}()); 

mediator.subscribe("LOG_IN", module1.myFunction, "Hello"); 

var module2 = (function(){ 

    return { 

     afterAuth: function(){ 
      mediator.publish("LOG_IN"); 
     } 

    }; 

}()); 

//After user authentication 
module2.afterAuth(); 

...:このような何か両方の戦略は、同じ利点(デカップリングなど)を持っているように見える一方で、このようなものが

var mediator = (function(){ 

    return { 
     runFunction: function(){ 
      var params; 

      if (arguments.length > 1){ 
       params = []; 
       for (var i=1; i < arguments.length; i++) params.push(arguments[i]); 
      } 

      if (arguments[0] && typeof arguments[0] === "function") arguments[0](params); 
     } 
    }; 

}()); 

var module1 = (function(){ 

    return { 
     myFunction: function(){ 
      console.log(arguments[0]); //"Hello" 
     } 
    }; 

}()); 

var module2 = (function(){ 

    return { 

     afterAuth: function(){ 
      mediator.runFunction(module1.myFunction, "Hello"); 
     } 

    }; 

}()); 

//After user authentication 
module2.afterAuth(); 

?:、最初の例は、(_jobsにサブスクリプション上に保持することによってオーバーヘッドを生成し、私はそれは、私が含まれていなかったのにこれを緩和するためにunsubscribe()メソッドを提供しますが、それでも問題は残ります)。 2番目の例よりはるかに複雑です。パフォーマンスの低下を招きます。問題に遭遇する可能性が高くなります。

メディエイターのパターンについて私は何を理解していませんか?単純な結果を達成するために不必要に畳み込まれた方法のように思えるのはなぜですか?なぜ私はこれらのサブスクリプションをすべて浮かべたいのですか_jobs

+1

module2はアプローチ2でmodule1と結婚しました。メディエーターは目的を果たしません – user943702

答えて

0

第1のアプローチは、実際Mediatorパターン内のすべてのモジュールは、メディエーターを介して各 連通し、一方、パブリッシャが を公開し、加入者が聴いたオブザーバーパターン、一例です。両方のパターンは同じ利点、すなわちデカップリングを共有する。 2番目の アプローチモジュール1はで、モジュール2とを通信し、デカップリングされません(module1は直接module2を参照しています) 、将来モジュールそれらのインターフェイスは です。モジュールがインタフェースを気にしないようにして、メディエータにそれをさせてください。懸念の分離:)

0

Iは、第一および第二の実施例との間の重要な違いは、最初の例では、module2がない参照module1を行いつつ、第2、module2参考文献にmediator.runFunction(module1.myFunction, "Hello");介しmodule1、代わりmediator.publish("LOG_IN");介してのみメディエーターを参照することであることが今や理解します明らかに、@ user943702によって指摘されているように、2番目の例は、「役に立たない」ということです。

関連する問題