zoukankan      html  css  js  c++  java
  • javascript实现责任链设计模式

    javascript实现责任链设计模式

    使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿这条链传递该请求,直到有一个对象处理他为止.

    这是Gof的定义.

    使用场景

    • 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻决定
    • 你想在不明确指定接受者的情况下,向多个对象中的一个提交一个请求
    • 可处理一个请求的对象集合应该被动态指定

    参与者

    • Handler: 处理请求的接口,并实现后继链(原型实现)
    • ConcreteHandler: 实际处理请求的实现.可以访问后继者.如果可以处理该请求,就处理;否则交由后继者处理.
    • Client: 组装责任链并进行使用

    实际案例

    整个最简单的规则校验把: 是否为空,是否数值,数值空间

    划分参与者

    Handler 校验器

    这边模仿spring mvc的HandlerAdapter接口来定义把.
    定义2个属性下一个责任处理者和上下文.
    定义了三个方法,判断是否处理;根据是否处理api决定是否自己处理;自己具体处理

    function Checker(next) {
        this._next = next;
    }
    
    Checker.prototype = {
        /**
         * 传递责任链
         */
        handle: function(context){
            this._context = context;
            if( this.support() ){
                this.handleInternal();
            } else if(this._next) {
                this._next.handle( this._context );
            }
        },
        /**
         * 具体进行业务逻辑执行的代码,需要被覆盖
         */
        handleInternal: function () {
    
        },
        /**
         * 判断本类是否处理
         * 中了spring的毒,按他家的写把
         * @returns {boolean}
         */
        support: function () {
            return false;
        }
    }
    

    定义具体的处理者

    处理者需要override support和handlerInternational.
    这边在定义的时候直接指定下一个责任者感觉是有问题的,这样不够灵活;比如需求一变,不再需要校验数值区间,我们就得修改代码.
    应该跟java里的做法那样,先把各个处理定义好,在client中再定义具体的责任链.
    今天时间不够了,改天再优化把

    RangeChecker = new Checker();
    RangeChecker.handleInternal = function () {
        console.log('RangeChecker.handleInternal: '+this._context.value);
    }
    RangeChecker.support = function () {
        return this._context.value > 60;
    }
    
    NumberChecker = new Checker(RangeChecker);
    NumberChecker.handleInternal = function () {
        console.log('NumberChecker.handleInternal: '+this._context.value);
    }
    NumberChecker.support = function () {
        return isNaN(this._context.value);
    }
    

    client 怎么用

    这边主要是准备一个上下文,然后直接调用就好

    console.log(' 非数值 ');
    NumberChecker.handle({value: 'sd'});
    console.log(' 数值34 ');
    NumberChecker.handle({value: 34});
    console.log(' 数值符合要求134 ');
    NumberChecker.handle({value: 134});
    

    接下来直接通过命令行看结果就好:

    node chain_of_responsibility.js
    
     空
    EmptyChecker.handleInternal: undefined
     非数值
    NumberCHecker.handleInternal: sd
     数值34
     数值符合要求134
    RangeChecker.handleInternal: 134
    

    详细代码看git吧.
    http://git.oschina.net/haplone/doc/blob/master/javascript/chain_of_responsibility.js

  • 相关阅读:
    可重入锁 RLOCK(转)
    python 全局变量的简单理解
    urlopen设置代理方法
    python is id == 的差别,cmp方法
    FutureTask
    Java基础复习
    计算机编程底层基础
    Microsoft.NET框架程序设计20 CLR寄宿、应用程序域、反射
    Microsoft.NET框架程序设计19 自动内存管理(垃圾收集)
    Microsoft.NET框架程序设计17 委托
  • 原文地址:https://www.cnblogs.com/leftthen/p/5849522.html
Copyright © 2011-2022 走看看