zoukankan      html  css  js  c++  java
  • js33--责任链模式

    <!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>
  • 相关阅读:
    JavaScript 面向对象
    javascript中this的指向
    销售
    Java垃圾回收机制
    判断浏览器是否缩放
    pattern space and hold space of sed
    语言基础
    Python中PyQuery库的使用总结
    多个计数器在Vuex中的状态
    Sklearn
  • 原文地址:https://www.cnblogs.com/yaowen/p/6888387.html
Copyright © 2011-2022 走看看