16-JavaScript设计模式——责任链模式

来源:互联网 发布:同志软件blued 编辑:程序博客网 时间:2024/06/05 01:59

职责链模式(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编程



原创粉丝点击