设计模式--职责链模式

简介

职责链使多个对象都有机会处理请求,将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象
处理他为止。避免了请求发送者和接受者之间的耦合。

简单的职责链实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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();

增加对异步请求的处理 可以让节点有权力决定什么时候把请求传递给下一个节点

1
2
3
4
5
Chain.prototype.next=function() {
if (this.successor) {
return this.successor.passRequest.apply(this.successor,arguments);
}
}

利用AOP实现职责链

1
2
3
4
5
6
7
8
9
10
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;
}
}