职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
先看以下场景:
// 有个任务,[小A, 小B, 小C, 小D]中的一个人可以做,但不知道谁能做
// 任务的类
var Assign = function(task){// task 任务类型
this.task = task;
};
// 接收任务的类
var WorkFlow = function(assign){
this.assign = assign;
};
WorkFlow.prototype = {
constructor : WorkFlow,
// 分析当前的任务到底谁能去执行
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('sql编程');
// 实例化处理任务的类
var wf = new WorkFlow(assign);
wf.filterHandler([e1, e2, e3, e4]);// 小D开发:sql编程
// 责任链作用:解除任务的 发送者 和 接受者 之间的耦合
// 还是这个任务,[小A, 小B, 小C, 小D]中的一个人可以做,但不知道谁能做
// 任务的类
var Assign = function(task){// task 任务类型
this.task = task;
};
// 接收任务的类
var WorkFlow = function(assign){
this.assign = assign;
};
WorkFlow.prototype = {
constructor : WorkFlow,
// 当过滤函数只接收一个 接受者 对象(链中的第一个接受者)
filterHandler : function(execute){
// 如果该接受者擅长此任务,则该接受者就去执行
if (this.assign.task === execute.cando) {
return execute.todo();
}else{
// 递归
arguments.callee.call(this, execute.successor);
}
}
};
// 处理者
var Executor = function(name, cando){
this.name = name;// 接受者的姓名
this.cando = cando;// 擅长的任务
this.successor = null;// 保留当前接受者的下一个对象的引用
};
Executor.prototype = {
constructor : Executor,
todo : function(){
document.write(this.name + '开发:' + this.cando);
},
// 关键:设置责任链的配置函数
setSuccessor : function(successor){
this.successor = successor;
return successor;
}
};
// 实例化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编程');
// 关键;为每个接受者 添加 下一个接受者的 引用
e1.setSuccessor(e2).setSuccessor(e3).setSuccessor(e4);
// 实例化任务对象
var assign = new Assign('java编程');
// 实例化处理任务的类
var wf = new WorkFlow(assign);
wf.filterHandler(e1);// 小C开发:java编程