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中作用
责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个 ...
随机推荐
- Multi-Projector Based Display Code ---- FAQ
Frequently Asked Question How do I know that my camera has a proper lens? Answer: If you can see exa ...
- mysql ON DUPLICATE KEY UPDATE 与 REPLACE INTO 的区别
#mysql ON DUPLICATE KEY UPDATE 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY ...
- 复制pdf文字出来是乱码
PDF文件复制文本为乱码 - longzhinuhou的博客 - CSDN博客 https://blog.csdn.net/longzhinuhou/article/details/83758966 ...
- [Day25]IO(Properties、序列化流、打印流、Commons-IO)
1.Properties类-持久的属性集,可保存在流中或从流中加载,属性列表中每个键及其对应值都是一个字符串 1.1 特点 (1)Hashtable的子类,map集合中的方法都可以用 (2)该集合没有 ...
- VueJS教程
文档资料参考: 参考:https://cn.vuejs.org/ 参考:Vue-Cli(客户端) 参考:创建一个Vue项目 参考:https://codesandbox.io 参考:https://c ...
- oracle_dataGuard_11G
[李红]--切记_从库只安装实例_不需要 dbca 创建数据库 但是 netca 创建监听看个人喜欢,我反正是创建了.[DataGuard_主数据库的参数配置]1.启用 force logging 功 ...
- ambari卸载集群
#1.删除hdp.repo和hdp-util.repo cd /etc/yum.repos.d/ rm -rf hdp* rm -rf HDP* #rm -rf ambari* #2.删除安装包 #用 ...
- springcloud第七步:fegin客户端调用工具
什么是Feign Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解 ...
- 【托业】【全真题库】TEST3-语法题
101. sales representative 销售代表 keep one's promise with 遵守对……的诺言,信守对……的承诺 107. express interest in 表现 ...
- Servlet服务器、客户端跳转
服务期跳转.服务器端转发.服务器端重定向是一个意思使用“req.getRequestDispatcher(“跳转路径”).forward(req,resp)”实现服务器端转发 客户端发送请求后数据传输 ...