定義
使多個對象都有機會處理請求,將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
要點
- 職責鏈模式只需要知道鏈中的第一個節點,從而弱化了發送者和一組接收者之間的強聯繫。
- 異步的職責鏈:需要給職責鏈節點對象增加一個手動傳遞請求到下一個節點的方法(而不是根據返回值來判斷是否繼續傳遞請求)。
- 職責鏈模式中的節點對象可以靈活地拆分重組:增加或者刪除一個節點,或者改變節點在鏈中的位置都是輕而易舉的事情。
- 職責鏈模式也可以手動指定起始節點。
- 對於所有對象都不能處理請求的情況,可以在鏈尾增加一個保底的接受者節點來處理,例如拋出一個錯誤異常。
- 從性能方面考慮,要避免過長的職責鏈帶來的性能損耗。
核心代碼
\\ 高階函數實現職責鏈,約定返回 'nextSuccessor' 代表「繼續傳遞請求」
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);
\\ 手動傳遞請求到下一個節點的方法
Chain.prototype.next = function() {
return this.successor && this.successor.passRequest.apply(this.successor, arguments);
};