es6 class中责任链模式与AOP结合
责任链模式大家应该都清楚,比如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结合的更多相关文章
- mina中责任链模式的实现
一.mina的框架回顾 责任链模式在mina中有重要的作用,其中Filter机制就是基于责任链实现的. 从上图看到消息的接受从IoService层先经过Filter层过滤处理后最后交给IoHander ...
- Activiti工作流学习笔记(四)——工作流引擎中责任链模式的建立与应用原理
原创/朱季谦 本文需要一定责任链模式的基础,主要分成三部分讲解: 一.简单理解责任链模式概念 二.Activiti工作流里责任链模式的建立 三.Activiti工作流里责任链模式的应用 一.简单理解责 ...
- C#设计模式-责任链模式
在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所以在面试的 ...
- C#设计模式(21)——责任链模式
一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所 ...
- 设计模式学习之责任链模式(Chain of Responsibility,行为型模式)(22)
参考:http://www.cnblogs.com/zhili/p/ChainOfResponsibity.html 一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1 ...
- Java设计模式13:责任链模式
前言 来菜鸟这个大家庭10个月了,总得来说比较融入了环境,同时在忙碌的工作中也深感技术积累不够,在优秀的人身边工作必须更加花时间去提升自己的技术能力.技术视野,所以开一个系列文章,标题就轻松一点叫做最 ...
- 拦截器——原理(AOP、责任链模式、配置)
1.Struts2拦截器概述: (1)Struts2框架封装中封装了很多功能,这些功能其实都是封装在Struts2的拦截器里面,Struts2里面有很多拦截器,每次不是这些拦截器都执行,每次只执行默认 ...
- [工作中的设计模式]责任链模式chain
一.模式解析 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...
- java设计模式之责任链模式以及在java中作用
责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...
随机推荐
- Python 学习笔记2 变量
Python变量的一些命名规则和指南 每种编程语言都需要变量, 这些变量的命名,我们一般会遵守一些公认的规则. 已达到方便自己,他人阅读的好处. 变量只能包含字母.数字和下划线.变量可以以字母和下划线 ...
- 【Python基础】lpthw - Exercise 45 制作游戏
作者在本节中给出了 一些风格建议. 一.函数的风格 1. 类里面的函数经常被称作“方法”,但实质上它和函数没什么不同. 2. 使用类的时候,可以用动词而不是名词给函数命名,指明其具体功能,例如list ...
- mayan游戏
这道题超级好 就是我太菜了写了几个小时不算是debug了几个小时. 我只想出了几个小剪枝 可能是状态不太好吧 写完这道题真的是完美诠释了什么,叫做: 暴力出奇迹!!! 真的是太暴力了. 最多只移动5步 ...
- angular脚手架搭建
下面以angular2.0为例前提已安装好node.js 1.安装cli执行如下命令npm install -g @angular/cli 2.创建新项目ng new my-app 3.然后到该项目目 ...
- 创建存储过程 in,out,inout
in: 输入参数,存储过程如果修改了参数值,那么不能被返回. out:输出参数,存储过程中修改了参数值,可以被返回.inout:输入参数,存储过程如果修改了参数值,可以被返回 注意参数格式: in ...
- Git常用功能记录
1. git查看某个文件的修改历史 git log --pretty 然后使用下面的命令可列出文件的所有改动历史,注意,这里着眼于具体的一个文件,而不是git库,如果是库,那改动可多了去了- git ...
- gradle入门教程
1,https://gradle.org/ 下载过后解压缩,绿色软件不需要安装. 配置系统环境:GRADLE_HOME设置为解压缩之后的地址,PATH属性追加%GRADLE_HOME%\bin; 2, ...
- python3.6安装docx模块
1.下载 python_docx-0.8.6-py2.py3-none-any.whl 地址: http://www.lfd.uci.edu/~gohlke/pythonlibs/2.在这个网页的最下 ...
- .NET Core 事件总线,分布式事务解决方案:CAP 基于Kafka
背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用的过程中也会遇到分布式事务的问题,那么 CAP 就是在这样的背景 ...
- JS中的闭包(转自他处)
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...