<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> <script type=text/javascript charset=utf-8 src=../commons/CommonUtil.js ></script> <script type=text/javascript charset=utf-8> //责任链模式 responsibility //目的:发出者 和接受者之间的耦合 /** * 发送者知道链中的第一个接受者,它向这个接受者发出请求 每一个接受者都对请求进行分析,要么处理它,要么往下传递 每一个接受者知道的其他对象只有一个,即它的下家对象 如果没有任何接受者处理请求,那么请求将从链上离开,不同的实现对此有不同的反应。 */ //做项目 ->:项目经理 :->task 项目组[小A,小B,小C,小D] //任务的类(发送者) var Assign = function(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('java编程'); //处理任务的类实例 var wf = new WorkFlow(assign); wf.filterHandler([e1,e2,e3,e4]); </script> </head> <body> </body> </html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> <script type=text/javascript charset=utf-8 src=../commons/CommonUtil.js ></script> <script type=text/javascript charset=utf-8> //责任链模式 responsibility //目的:发出者 和 接受者之间的耦合 /** * 发送者知道链中的第一个接受者,它向这个接受者发出请求 每一个接受者都对请求进行分析,要么处理它,要么往下传递 每一个接受者知道的其他对象只有一个,即它的下家对象 如果没有任何接受者处理请求,那么请求将从链上离开,不同的实现对此有不同的反应。 */ //做项目 ->:项目经理 :->task 项目组[小A,小B,小C,小D] //任务的类(发送者) var Assign = function(task){ this.task = task ; }; // 接受任务的类 var WorkFlow = function(assign){ this.assign = assign; }; WorkFlow.prototype = { constructor:WorkFlow, //当前过滤函数只接受 一个接收者对象(链中的第一个接收者) filterHandler:function(executor){ //如果当前任务 适合 就直接执行 if(this.assign.task === executor.cando ){ return executor.todo(); } else { //call apply 大显身手。arguments.callee当前函数 //arguments.callee(executor.successor),要用this,不然this就不是当前对象了。 arguments.callee.call(this,executor.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; } }; //实例化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); e2.setSuccessor(e3); e3.setSuccessor(e4); //实例化任务对象 var assign = new Assign('sql编程'); //处理任务的类实例 var wf = new WorkFlow(assign); wf.filterHandler(e1); </script> </head> <body> </body> </html>
本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/6888387.html,如需转载请自行联系原作者