- 责任链模式可以用来消除请求的发送者和接受者之间的耦合。这是通过实现一个由隐式地对请求进行处理的对象组成的链而做到的。链中的每个对象可以处理请求,也可以将其传给下一个对象。javascript内部就是使用这个模式来处理时间捕获和冒泡的问题。
- 责任链模式中的角色: 发出者、接受者
- 责任链模式的流程:
- 发送者知道链中的第一个接受者,它向这个接收者发出来的请求;
- 每一个接收者都对请求进行分析,要么处理它,要么往下传递;
- 每一个接收者知道的其他对象只有一个,即它的下家对象;
- 如果没有任何的接收者处理请求,那么请求将从链上离开,不同的实现对此有不同的反应;
//模拟场景 -》:项目经理 :-》task 项目组(A B C D)
//任务类
var Assign = function(task){
this.task = task;
};
//接收任务的类
var workFlow = function(assign){
this.assign = assign;
}
workFlow.prototype = {
constructor:workFlow,
//分析当前任务谁能去完成执行 len是个缓存,不用每次去遍历es
filterHandler:function(es){
for(var i=0 ,len = es.length; i<len;i++){
if(this.assign.task === es[i].cando){
return es[i].todo();
}
}
return;
}
};
//处理者
var Executor = function(name,cando){
this.name = name;//接收者的姓名
this.cando = cando;//擅长的任务
};
Executor.prototype = {
constructor: Executor,
todo:function(){
document.write(this.name+'开发'+this.cando);
}};
//4个接收者
var e1 = new Executor('A','javascript');
var e2 = new Executor('B','css');
var e3= new Executor('C','java');
var e4 = new Executor('D','sql');
//实例化任务对象
var assign = new Assign('java');
//处理任务的实例
var wf = new workFlow(assign);
wf.filterHanlder([e1,e2,e3,e4]);