zoukankan      html  css  js  c++  java
  • js设计模式(12)---职责链模式

    0.前言                                                                   

       老实讲,看设计模式真得很痛苦,一则阅读过的代码太少;二则从来或者从没意识到使用过这些东西。所以我采用了看书(《js设计模式》)和阅读博客(大叔、alloyteam、聂微东)相结合的办法,勉勉强强写了这么多随笔,当然写随便不是为了炫耀,而是对知识进行总结,以便加深理解。

    1.职责链模式是什么?                                               

       有一个请求,多个对象都可以处理该请求,但是到底哪个对象要处理该请求在开发期是不确定的,也就是说请求的发送者和接受者是一种动态的关系。所以需要将这些对象链成一条链,并沿着这条链传递该请求,链上的对象要么处理该请求,要么传递给下一个对象。从而避免了请求的发送者和接受者之间的耦合关系。

      职责链模式经常和组合模式一起使用,这样一个构件的父构件可以作为其继任者。DOM里面的事件冒泡机制也和此有类似的地方。

    2.流程                                                                     

       2.1、发送者知道链中的第一个接受者,它向这个接受者发送请求;

       2.2、链中的接受者对该请求进行分析,然后要么处理它要么传给下一个对象;

       2.3、每个接受者知道的其他对象只有一个,即它在链中的下家;

       2.4、如果没有任何接受者处理请求,那么请求将从链中离开,不同的实现对此也有不同的反应,一般会抛出一个错误。

    3.代码说明                                                                

        本人水平有限,就直接把大叔的代码拿过来,再次体现拿来主义吧。   

    var NO_TOPIC = -1;
    var Topic;
    
    function Handler(s, t) {
        this.successor = s || null;
        this.topic = t || 0;
    }
    
    Handler.prototype = {
        handle: function () {
            if (this.successor) {
                this.successor.handle()
            }
        },
        has: function () {
            return this.topic != NO_TOPIC;
        }
    };
    var app = new Handler({
        handle: function () {
            console.log('app handle');
        }
    }, 3);
    
    var dialog = new Handler(app, 1);
    dialog.handle = function () {
        console.log('dialog before ...')
        // 这里做具体的处理操作
        Handler.prototype.handle.call(this); //继续往上走
        console.log('dialog after ...')
    };
    
    var button = new Handler(dialog, 2);
    button.handle = function () {
        console.log('button before ...')
        // 这里做具体的处理操作
        Handler.prototype.handle.call(this);
        console.log('button after ...')
    };
    
    button.handle();
    //输出结果
    button before ...
    dialog before ...
    app handle
    dialog after ...
    button after ...

    4.个人理解                                                               

      1.使用条件:有一个请求,多个对象都可以对其处理,但是到底是哪个对象要处理,在开发期是不确定的;

      2.如何使用:把这些对象链到一条链上,链上的对象要么处理该请求,要么将其传递给下一个对象;

      3.DOM中的事件冒泡就跟此类似。

  • 相关阅读:
    Ubuntu配置sublime text 3的c编译环境
    ORA-01078错误举例:SID的大写和小写错误
    linux下多进程的文件拷贝与进程相关的一些基础知识
    ASM(四) 利用Method 组件动态注入方法逻辑
    基于Redis的三种分布式爬虫策略
    Go语言并发编程总结
    POJ2406 Power Strings 【KMP】
    nyoj 会场安排问题
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
    Java的String、StringBuffer和StringBuilder的区别
  • 原文地址:https://www.cnblogs.com/shamoguying1140/p/3171170.html
Copyright © 2011-2022 走看看