定義
使多個對象都有機會處理請求,將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止跛梗。
要點
- 職責鏈模式只需要知道鏈中的第一個節(jié)點,從而弱化了發(fā)送者和一組接收者之間的強聯(lián)繫柿顶。
- 異步的職責鏈:需要給職責鏈節(jié)點對象增加一個手動傳遞請求到下一個節(jié)點的方法(而不是根據(jù)返回值來判斷是否繼續(xù)傳遞請求)茄袖。
- 職責鏈模式中的節(jié)點對象可以靈活地拆分重組:增加或者刪除一個節(jié)點,或者改變節(jié)點在鏈中的位置都是輕而易舉的事情嘁锯。
- 職責鏈模式也可以手動指定起始節(jié)點宪祥。
- 對於所有對象都不能處理請求的情況,可以在鏈尾增加一個保底的接受者節(jié)點來處理家乘,例如拋出一個錯誤異常蝗羊。
- 從性能方面考慮,要避免過長的職責鏈帶來的性能損耗仁锯。
核心代碼
\\ 高階函數(shù)實現(xiàn)職責鏈耀找,約定返回 'nextSuccessor' 代表「繼續(xù)傳遞請求」
Function.prototype.after = function(fn) {
var self = this;
return function() {
var ret = self.apply(this, arguments);
if (ret === 'nextSuccessor') {
return fn.apply(this, arguments);
}
return ret;
};
};
var order = order500.after(order200).after(orderNormal);
order(1, true, 500);
\\ 手動傳遞請求到下一個節(jié)點的方法
Chain.prototype.next = function() {
return this.successor && this.successor.passRequest.apply(this.successor, arguments);
};