[英]Mediator Pattern vs. Direct Calls to Intermediate Function
Mediator的設計模式如何,例如:
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()
方法來幫助緩解這種情況,但這仍然是一個問題); 比第二個例子復雜得多; 會導致性能略有下降; 並且更有可能遇到問題。
我對Mediator模式的理解是什么? 為什么它看起來像是一種不必要的復雜方式來實現簡單的結果? 為什么我希望所有這些訂閱在_jobs
浮動?
我現在認識到的第一例和第二例之間的重要區別在於,在第二, module2
引用module1
通過mediator.runFunction(module1.myFunction, "Hello");
,在第一個示例中, module2
不引用module1
,而是僅通過mediator.publish("LOG_IN");
引用介mediator.publish("LOG_IN");
顯然,正如@ user943702所指出的那樣,第二個例子“毫無用處”。
第一種方法實際上是Observer Pattern的示例,其中發布者進行發布,訂閱者偵聽,而在Mediator Pattern中,所有模塊都通過中介器相互通信。 兩種模式都具有相同的優勢,即去耦。 在第二種方法中,module1與module2 通信並且沒有解耦(module1直接引用module2),並且它似乎非常適合應用Mediator Pattern,如果將來你要對模塊及其接口進行大量更改。 最好不要讓模塊擔心接口,讓調解員去做。 關注點分離 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.