简介
职责链使多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象
处理他为止。避免了请求发送者和接受者之间的耦合。
简单的职责链实现
var Chain=function(fn) {
this.fn=fn;
this.successor=null;
}
Chain.prototype.setNextSuccessor=function(successor) {
return this.successor=successor;
}
Chain.prototype.passRequest=function() {
var ret=this.fn.apply(this,arguments);
if (ret==='nextSuccessor' && this.successor) {
return this.successor.passRequest.apply(this.successor,arguments);
}
return ret;
}
//使用
var fn1=new Chain(function() {
console.log(1);
return 'nextSuccessor';
})
var fn2=new Chain(function() {
console.log(2);
return 'nextSuccessor';
})
var fn3=new Chain(function() {
console.log(3);
})
fn1.setNextSuccessor(fn2);
fn2.setNextSuccessor(fn3);
fn1.passRequest();
增加对异步请求的处理 可以让节点有权力决定什么时候把请求传递给下一个节点
Chain.prototype.next=function() {
if (this.successor) {
return this.successor.passRequest.apply(this.successor,arguments);
}
}
利用AOP实现职责链
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;
}
}