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

javascript实现责任链设计模式的更多相关文章

  1. PHP责任链设计模式

    <?php //责任链设计模式 /** * 每个对象,储存着对自己上级的引用, * 如果自己处理不了,交给上一级. */ class board{ protected $power=1; pro ...

  2. Java设计模式之责任链设计模式

    职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理 ...

  3. Jfinal----Handler之责任链设计模式

    Jfinal handler的处理采用了责任链设计模式 有关责任链模式,推荐看: <JAVA与模式>之责任链模式 1.实现Handler只需要继承Handler public class ...

  4. java filter过滤器及责任链设计模式

    什么是Filter? Filter属于sevlet规范,翻译为过滤器. Filter在web开发中有什么作用? 案例一:一个web站点只有用户登录才能继续访问该站点的资源,那么需要用户每次访问都判断是 ...

  5. Java中的责任链设计模式,太牛了!

    责任链设计模式的思想很简单,就是按照链的顺序执行一个个处理方法,链上的每一个任务都持有它后面那个任务的对象引用,以方便自己这段执行完成之后,调用其后面的处理逻辑. 下面是一个责任链设计模式的简单的实现 ...

  6. [设计模式] javascript 之 责任链模式

    责任链模式:定义 责任链接模式又称职责链模式,是一种对象的行为模式:它是一种链式结构,每个节点都有可能两种操作,要么处理该请求停止该请求操作,要么把请求转发到下一个节点,让下一个节点来处理请求:该模式 ...

  7. JAVA责任链设计模式

    <JAVA与模式>之责任链模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模 ...

  8. Sentinel-Go 源码系列(二)|初始化流程和责任链设计模式

    上节中我们知道了 Sentinel-Go 大概能做什么事情,最简单的例子如何跑起来 其实我早就写好了本系列的第二篇,但迟迟没有发布,感觉光初始化流程显得有些单一,于是又补充了责任链模式,二合一,内容显 ...

  9. MyBatis功能点二:从责任链设计模式的角度理解插件实现技术

    MyBatis允许对其四大组件(Executor,StatementHandler,ParameterHandler, ResultSetHandler)进行增强处理.在创建四大组件对象的时候 1.每 ...

随机推荐

  1. webserive学习记录5-拦截器完成登陆校验

    说说cxf中的拦截器,可以分为系统拦截器(如日志拦截器)和自定义拦截器,也可以分为出拦截器和入拦截器,也可以分为服务器拦截器和客户端拦截器. 下面将实现一个可以进行登陆验证的拦截器,其中用户名作为方法 ...

  2. scala 建模

    // train multinomial logistic regression val lr = new LogisticRegressionWithLBFGS() .setIntercept(tr ...

  3. Python在pycharm中编程时应该注意的问题汇总

    1.缩进问题 在 pycharm 中点击 enter 自动进行了换行缩进,此时应该注意:比如 if   else  语句,后面跟着打印输出 print 的时候,一定注意是要if语句下的输出还是else ...

  4. 根据条件决定My97DatePicker日期控件弹出的日期格式

    代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <tit ...

  5. mysql 导入csv 转义

    TERMINATED :分隔符 ESCAPED :转义用什么标示,‘’ 不设置转义符 LOAD DATA LOCAL INFILE '/home/tmp/1999/holder.csv'  INTO ...

  6. import变量名,导入模块

    想要把不同的模块名赋值到变量,然后import进来   直接使用下面的方法是不行的: moudle="os" import moudle   会提示下面的错误: ImportErr ...

  7. Idea多个module下maven的pom.xml失效的问题

    今天在Idea中配置spring-cloud时,配置了两个module,结果其中一个module的pom.xml失效了.. 解决方法: 1.点击Idea右侧的Maven Project 2.点击&qu ...

  8. nyoj528-找球号(三) 【位运算】

    http://acm.nyist.net/JudgeOnline/problem.php?pid=528 找球号(三) 时间限制:2000 ms  |  内存限制:3000 KB 难度:2   描述 ...

  9. 【校招面试 之 C/C++】第17题 C 中的malloc相关

    1.malloc (1)原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include ...

  10. linux 下的 rsync 文件同步

    rsync是linux下的一款快速增量备份工具Remote Sync,是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息.rsync是用 “rsync ...