责任链模式大家应该都清楚,比如JS中的冒泡,Java中的拦截器、过滤器,都运用到了责任链模式。

可以看我之前的文章介绍责任链的:https://www.cnblogs.com/wuguanglin/p/ChainofResponsibilityPattern.html

我们在遇到一个请求,经过多个节点处理的时候就可以考虑使用责任链模式降低代码耦合度。

纯责任链模式

在es6 class语法下,我们可能会写出下面这样的代码:

'use strict';

class HandlerFactory {
createHandler() {
const aaa = new AaaHandler();
const bbb = new BbbHandler();
const ccc = new CccHandler();
const ddd = new DddHandler();
const eee = new EeeHandler();
aaa.setNext(bbb);
bbb.setNext(ccc);
ccc.setNext(ddd);
ddd.setNext(eee);
return aaa;
}
} class Handler {
setNext(_handler) {
this.nextHandler = _handler;
}
handleMsg(msg) {}
}
class AaaHandler extends Handler {
handleMsg(msg) {
if (msg < 0.2) {
console.log('AaaHandler处理了:' + msg);
} else {
this.nextHandler.handleMsg(msg);
}
}
} class BbbHandler extends Handler {
handleMsg(msg) {
if (msg < 0.3) {
console.log('BbbHandler处理了:' + msg);
} else {
this.nextHandler.handleMsg(msg);
}
}
} class CccHandler extends Handler {
handleMsg(msg) {
if (msg < 0.5) {
console.log('CccHandler处理了:' + msg);
} else {
this.nextHandler.handleMsg(msg);
}
}
} class DddHandler extends Handler {
handleMsg(msg) {
if (msg < 0.6) {
console.log('DddHandler处理了:' + msg);
} else {
this.nextHandler.handleMsg(msg);
}
}
} class EeeHandler extends Handler {
handleMsg(msg) {
if (msg < 0.8) {
console.log('EeeHandler处理了:' + msg);
} else {
console.log('没有handler可以处理了:' + msg);
}
}
} const handlerFactory = new HandlerFactory();
const handler = handlerFactory.createHandler();
handler.handleMsg(Math.random());

代码的大概意思就是构建了一个msg处理链。但是我们可以看到这种实现方式还是觉得有点不太完美,不完美的地方在哪呢?

就是在于不断的setNext()设置下一个处理者,每个处理者的后继者都是由它自己维护的,也就是整个链条的关系是由所有的处理者共同维护的。所以这里可以优化,我们可以通过AOP(切面编程)的思想来把责任链抽象出来,解除链条与处理者的耦合关系。

非纯责任链模式

Talk is cheap,Show me the code

'use strict';

class HandlerChainFactory {
createHandlerChain() {
const handlers = [];
handlers.push(new AaaHandler());
handlers.push(new BbbHandler());
handlers.push(new CccHandler());
handlers.push(new DddHandler());
handlers.push(new EeeHandler());
return new HandlerChain(handlers);
}
} class HandlerChain {
constructor(handlers) {
this.handlers = handlers;
}
handleMsg(msg) {
if (this.handlers.length) {
const handler = this.handlers.shift();
handler.handleMsg(msg, this);
} else {
console.log('没有handler:' + msg);
}
}
} class AaaHandler {
handleMsg(msg, chain) {
if (msg < 0.2) {
console.log('AaaHandler处理了:' + msg);
} else {
chain.handleMsg(msg);
}
}
} class BbbHandler {
handleMsg(msg, chain) {
if (msg < 0.3) {
console.log('BbbHandler处理了:' + msg);
} else {
chain.handleMsg(msg);
}
}
} class CccHandler {
handleMsg(msg, chain) {
if (msg < 0.5) {
console.log('CccHandler处理了:' + msg);
} else {
chain.handleMsg(msg);
}
}
} class DddHandler {
handleMsg(msg, chain) {
if (msg < 0.6) {
console.log('DddHandler处理了:' + msg);
} else {
chain.handleMsg(msg);
}
}
} class EeeHandler {
handleMsg(msg, chain) {
if (msg < 0.8) {
console.log('EeeHandler处理了:' + msg);
} else {
console.log('没有handler可以处理了:' + msg);
}
}
} const handlerChainFactory = new HandlerChainFactory();
const handleChain = handlerChainFactory.createHandlerChain();
handleChain.handleMsg(Math.random());

可以看到,改进后的责任链模式,代码更加清晰了,希望对大家有帮助。

es6 class中责任链模式与AOP结合的更多相关文章

  1. mina中责任链模式的实现

    一.mina的框架回顾 责任链模式在mina中有重要的作用,其中Filter机制就是基于责任链实现的. 从上图看到消息的接受从IoService层先经过Filter层过滤处理后最后交给IoHander ...

  2. Activiti工作流学习笔记(四)——工作流引擎中责任链模式的建立与应用原理

    原创/朱季谦 本文需要一定责任链模式的基础,主要分成三部分讲解: 一.简单理解责任链模式概念 二.Activiti工作流里责任链模式的建立 三.Activiti工作流里责任链模式的应用 一.简单理解责 ...

  3. C#设计模式-责任链模式

    在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所以在面试的 ...

  4. C#设计模式(21)——责任链模式

    一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所 ...

  5. 设计模式学习之责任链模式(Chain of Responsibility,行为型模式)(22)

    参考:http://www.cnblogs.com/zhili/p/ChainOfResponsibity.html 一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1 ...

  6. Java设计模式13:责任链模式

    前言 来菜鸟这个大家庭10个月了,总得来说比较融入了环境,同时在忙碌的工作中也深感技术积累不够,在优秀的人身边工作必须更加花时间去提升自己的技术能力.技术视野,所以开一个系列文章,标题就轻松一点叫做最 ...

  7. 拦截器——原理(AOP、责任链模式、配置)

    1.Struts2拦截器概述: (1)Struts2框架封装中封装了很多功能,这些功能其实都是封装在Struts2的拦截器里面,Struts2里面有很多拦截器,每次不是这些拦截器都执行,每次只执行默认 ...

  8. [工作中的设计模式]责任链模式chain

    一.模式解析 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...

  9. java设计模式之责任链模式以及在java中作用

    责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...

随机推荐

  1. 使用OMS查询Api Management的调用日志

    打开Azure portal,找到要操作的Api Management 实例,点击菜单Monitoring/Logs Schema Tab页搜索"diagnostics",选中Lo ...

  2. hive高级数据类型

    hive的高级数据类型主要包括:数组类型.map类型.结构体类型.集合类型,以下将分别详细介绍. 1)数组类型 array_type:array<data_type> -- 建表语句 cr ...

  3. [emacs] emacs设置python code的indent

    装python-mode的包 https://gitlab.com/python-mode-devs/python-mode/tree/master python-mode emacswiki文档 e ...

  4. python摸爬滚打之day030----进程

    1.操作系统了解 现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成, 这些都是硬件设备, 而操作系统就是负责调用这些硬件为用户服务的. ...

  5. pkg-config 详解

    转载自:https://blog.csdn.net/newchenxf/article/details/51750239 1 什么是pkg-config pkg-config是一个linux下的命令, ...

  6. 制作自己的docker镜像

    制作自己的Docker镜像主要有如下两种方式: 1.使用docker commit 命令来创建镜像 通过docker run命令启动容器 修改docker镜像内容 docker commit提交修改的 ...

  7. hibernate学习(缓存)

    缓存,介于应用程序和永久数据存储源之间,作用是为了降低应用程序对物理数据源访问的频率,从而提高应用的运行性能. 例如我们cpu执行效率每秒处理的数据高达上千兆,而我们的硬盘读取速度却没那么高,读取几百 ...

  8. hisi35xx串口驱动的完善

    鉴于hisi的uart3还没有打通,ls /dev/ | grep ttyA* ,看到的只有ttyAMA0 和ttyAMA1,且使用应用程序打开ttyAMA1设备后,使用write函数,发送,示波器观 ...

  9. DAX/PowerBI系列 - 查询参数用法详解(Query Parameter)

    PowerBI  - 查询参数用法详解(Query Parameter) 很多人都不知道查询参数用来干啥,下面总结一下日常项目中常用的几个查询参数的地方.(本人不太欢hardcode的东西) 使用查询 ...

  10. h5样式布局

    在文字的左面加图标  background: url(../images/hi.png) left no-repeat; 如图所示