责任链模式

  • 一、定义
  • 二、普通责任链模式
  • 三、异步责任链模式

一、定义

责任链模式(Chain of Responsibility Pattern):避免将一个请求的发送者与接受者耦合在一起,让多个对象都有机会处理请求。将接受请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止。

在很多源码都有涉及,如Mybatis拦截器、Filter…

责任链模式属于行为型模式。

二、普通责任链模式

  1. 抽象处理类:AbstractProcessor
/*** 抽象处理类*/
public abstract class AbstractProcessor {// 责任链private AbstractProcessor nextProcessor;public void setNextProcessor(AbstractProcessor nextProcessor){this.nextProcessor = nextProcessor;}/*** 链路调用* @param obj*/public void execute(Object obj) {this.processor(obj);if (this.nextProcessor != null){this.nextProcessor.execute(obj);}}public abstract void processor(Object obj);
}
  1. 具体类:ParamsProcessor、CheckProcessor、FinalProcessor
public class ParamsProcessor extends AbstractProcessor{@Overridepublic void processor(Object obj) {System.out.println("paramsProcessor>>>>>>>>>>" + obj.toString());}
}public class CheckProcessor extends AbstractProcessor{@Overridepublic void processor(Object obj) {System.out.println("checkProcessor>>>>>>>>>>" + obj.toString());}
}public class FinalProcessor extends AbstractProcessor{@Overridepublic void processor(Object obj) {System.out.println("finalProcessor>>>>>>>>>>" + obj.toString());}
}
  1. 测试类:ProcessorMainTest
public class ProcessorMainTest {public static void main(String[] args) {/*** 构建一个链路* paramsProcessor -> checkProcessor -> finalProcessor*/AbstractProcessor paramsProcessor = new ParamsProcessor();AbstractProcessor checkProcessor = new CheckProcessor();AbstractProcessor finalProcessor = new FinalProcessor();paramsProcessor.setNextProcessor(checkProcessor);checkProcessor.setNextProcessor(finalProcessor);paramsProcessor.execute("Java责任链模式");}
}
  1. 执行结果

paramsProcessor>>>>>>>>>>Java责任链模式
checkProcessor>>>>>>>>>>Java责任链模式
finalProcessor>>>>>>>>>>Java责任链模式

三、异步责任链模式

异步责任链模式采用责任链模式、生产者消费者模式组合。

  1. 抽象处理类:AbstractAsynProcessor
/*** 异步责任链:采用线程、生产者消费者模式实现*/
public abstract class AbstractAsynProcessor extends Thread {// 用于存放当前责任链需要处理的对象protected BlockingQueue<Object> queue;// 链路对象private AbstractAsynProcessor nextProcessor;/*** 执行** @param obj*/public void execute(Object obj) throws InterruptedException {this.processor(obj);if (this.nextProcessor != null) {this.nextProcessor.getQueue().put(obj);}}@Overridepublic void run() {// 执行try {while (true) {// 生产者消费者Object obj = this.queue.take();execute(obj);}} catch (InterruptedException e) {e.printStackTrace();}}public abstract void processor(Object obj);public BlockingQueue<Object> getQueue() {return queue;}public void setNextProcessor(AbstractAsynProcessor nextProcessor) {this.nextProcessor = nextProcessor;}
}
  1. 具体类:AsynParamsProcessor、AsynCheckProcessor、AsynFinalProcessor
public class AsynParamsProcessor extends AbstractAsynProcessor {public AsynParamsProcessor() {// 初始化队列this.queue = new LinkedBlockingQueue<>();}@Overridepublic void processor(Object obj) {System.out.println("asynParamsProcessor>>>>>>>>>>" + obj.toString());}
}public class AsynCheckProcessor extends AbstractAsynProcessor {public AsynCheckProcessor(){this.queue = new LinkedBlockingQueue<>();}@Overridepublic void processor(Object obj) {System.out.println("asynCheckProcessor>>>>>>>>>>" + obj.toString());}
}public class AsynFinalProcessor extends AbstractAsynProcessor {public AsynFinalProcessor() {this.queue = new LinkedBlockingQueue<>();}@Overridepublic void processor(Object obj) {System.out.println("asynFinalProcessor>>>>>>>>>>" + obj.toString());}
}
  1. 测试类:AsynProcessorMainTest
public class AsynProcessorMainTest {public static void main(String[] args) throws InterruptedException {/*** 构建一个链路* asynParamsProcessor -> asynCheckProcessor -> asynFinalProcessor*/AbstractAsynProcessor asynParamsProcessor = new AsynParamsProcessor();asynParamsProcessor.start();AbstractAsynProcessor asynCheckProcessor = new AsynCheckProcessor();asynCheckProcessor.start();AbstractAsynProcessor asynFinalProcessor = new AsynFinalProcessor();asynFinalProcessor.start();asynParamsProcessor.setNextProcessor(asynCheckProcessor);asynCheckProcessor.setNextProcessor(asynFinalProcessor);Scanner input = new Scanner(System.in);while (true) {Thread.sleep(1000);System.out.print("请输入:");asynParamsProcessor.getQueue().put(input.next());}}
}
  1. 执行结果

请输入:Java异步责任链
asynParamsProcessor>>>>>>>>>>Java异步责任链
asynCheckProcessor>>>>>>>>>>Java异步责任链
asynFinalProcessor>>>>>>>>>>Java异步责任链

Java责任链模式及异步责任链相关推荐

  1. java责任链模式_java中责任链模式详解和使用方法

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为 ...

  2. java 责任链模式 链表_责任链模式的实现及源码中应用

    01 - 责任链模式的实现 假设一个出差任务的流程需要审批出差行程和出差报销金额.那么,对应两个部门的审核.我们先定义一个出差任务Task类: 然后,我们定义一个抽象的处理类Handler,其中具体的 ...

  3. Java设计模式之责任链模式(纯责任链和不纯责任链模式)

    一.概述 避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求.将接收请求的对象连接成一条链,并且沿着这条链传递请求,知道有一个对象能够处理它为止. 二.结构与实现 结构 (1)Han ...

  4. 传统责任链模式和变种责任链模式

    一.传统责任链模式 传统责任链模式是事件在链条中的某一节进行处理,而变种责任链模式是事件会在链条的每一节都进行处理,每一节担当的责任各不相同. 1.一个接口或抽象类 定义一个接口,一个方法,判断数值是 ...

  5. java 职责链模式_java设计模式-职责链模式

    模式导读: 作为一名大学生,相信我们都有过请假的经历,在我们请假是总会碰到这样的场景,就是当请假的时间超过5天(包括5天),我们的请假条就不能由班主任进行审阅通过了,而是需要上交院系,由院领导进行审阅 ...

  6. 折腾Java设计模式之责任链模式

    责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计 ...

  7. [转]《JAVA与模式》之责任链模式

    http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样描述责 ...

  8. 《JAVA与模式》之责任链模式

    2019独角兽企业重金招聘Python工程师标准>>> 详细请访问原博客:http://www.cnblogs.com/java-my-life/archive/2012/05/28 ...

  9. Java设计模式学习总结(15)——行为型模式之责任链模式

    责任链模式 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计 ...

  10. java里面的环链怎么做_Java模式开发之责任链模式

    从前往后按照一定操作顺序进行  申明一个过滤器接口,里面有一个"方法申明" 叫 规则过滤,返回处理后的结果 申明一些具体的操作类,全部实现过滤器接口,重写里头规则过滤的方法,返回规 ...

最新文章

  1. linux下的time函数们
  2. Java NIO浅析
  3. Xilinx zynq-7000 SOC 设计导论
  4. Exceptionless 5.0.0本地Docker快速部署介绍
  5. jaxb 映射 空字段_JAXB和未映射的属性
  6. 360浏览器一打开就是瑞星安全网址怎么办
  7. android汉字转url,Android将文本中的URL转换为超链接工具类(原文本有超链接标签也适用)...
  8. 《Windows via C/C++》学习笔记 —— 内核对象的“线程同步”之“信号量”
  9. VRRP与VLAN综合实验
  10. 高精度算法 万字详解(C++)
  11. jquery 之简单好用的分页插件的使用方法 jQuery分页插件pageGroup.js
  12. W3School 离线手册最新版下载
  13. kindle中azw3和mobi哪个好?
  14. aodv-uu 源码解读
  15. python3抓取-双色球开奖的所有历史数据-2003年始
  16. 自学Java之基础篇——使用switch,输出今天到底是礼拜几(case的穿透)
  17. excel 宏录制,宏代码查看
  18. python3打印金字塔_python3 练习题100例 (二十五)打印一个n层金字塔
  19. ETL(八):路由器(rounter)转换组件的使用
  20. zabbix 监控snmp 网络设备

热门文章

  1. 微商如何突破月入过万
  2. vs2017使用教程
  3. 用计算机新字库打出的文字,为什么用五笔打字有很多字打不出来(GBK和GB2312字库的区别)...
  4. MATLAB 的串口连接
  5. 测试之串口连接及调试
  6. linux 消息队列API
  7. NiFi+Kylo安装部署
  8. 拉格朗日插值公式详解
  9. digester java_java digester
  10. 经验模态分解(EMD)