责任链模式大家应该都清楚,比如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. Linux技术栈整理一:系统体系结构

    Linux操作系统必备的硬件构造: CPU 主板 显卡 硬盘 网卡 外设(键鼠-输入设备 / 显示器-输出设备) 内核管理调度: 内核体系结构: 来源于:极客专栏

  2. kali2.0安装docker(转)

    开始部署 1. Docker需要Linux Kernels 大于3.10并且是64-bit的机器,用uname -a可以查看是否符合要求. 2. 执行命令编辑文本: vim /etc/apt/sour ...

  3. python learning day01

    python简介 一.python的由来: python的创始人是吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚 ...

  4. Building gRPC Client iOS Swift Note Taking App

    gRPC is an universal remote procedure call framework developed by Google that has been gaining inter ...

  5. How to disable transparent hugepages (THP) on Red Hat Enterprise Linux 7

    How to disable transparent hugepages (THP) on Red Hat Enterprise Linux 7 $ Solution 已验证 - 已更新2017年六月 ...

  6. js基础--高阶函数(map,reduce,filter,sort)

    高阶函数 一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数,编写高阶函数,就是让函数的参数能够接收别的函数. function add (x,y,f){return f(x)+f(y)} ...

  7. Delphi 2010 新增功能之: IOUtils 单元(6): TPath(结构体) 的方法与属性

    以后路径相关的处理, 用 IOUtils.TPath 就很方便了. //较常用的方法: TPath.GetTempPath;                  {获取临时文件夹路径} TPath.Ge ...

  8. U盘挂载指令

    相关步骤来自于百度 1.先确定U盘格式,如果是ntfs格式,需要先安装3g-ntfs这个软件支持ntfs格式,以下默认U盘为fat32格式 2.使用fdisk -l 查看分区表,找到u盘的设备号,比如 ...

  9. thinkphp ckeditor与ckfinder

    thinkphp ckeditor与ckfinder 下载 ckeditor下载地址 ckfinder下载地址 整合 将ckeditor与findeditor下载完成后,放到public目录下,配置c ...

  10. asp.net中的CheckBox控件的使用

    CheckBox控件中的最重要属性就是checked属性了 下面就是使用checked属性的一个小应用; 先建立一个wed窗体:在窗体中写下这些代码: <%@ Page Language=&qu ...