经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Java 设计模式之责任链模式及异步责任链详解
来源:jb51  时间:2021/11/8 17:19:02  对本文有异议

一、定义

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

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

在这里插入图片描述

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

二、普通责任链模式

在这里插入图片描述

抽象处理类:AbstractProcessor

  1. /**
  2. * 抽象处理类
  3. */
  4. public abstract class AbstractProcessor {
  5. // 责任链
  6. private AbstractProcessor nextProcessor;
  7.  
  8. public void setNextProcessor(AbstractProcessor nextProcessor){
  9. this.nextProcessor = nextProcessor;
  10. }
  11.  
  12. /**
  13. * 链路调用
  14. * @param obj
  15. */
  16. public void execute(Object obj) {
  17. this.processor(obj);
  18. if (this.nextProcessor != null){
  19. this.nextProcessor.execute(obj);
  20. }
  21. }
  22.  
  23. public abstract void processor(Object obj);
  24. }

具体类:ParamsProcessor、CheckProcessor、FinalProcessor

  1. public class ParamsProcessor extends AbstractProcessor{
  2.  
  3. @Override
  4. public void processor(Object obj) {
  5. System.out.println("paramsProcessor>>>>>>>>>>" + obj.toString());
  6. }
  7. }
  8.  
  9. public class CheckProcessor extends AbstractProcessor{
  10.  
  11. @Override
  12. public void processor(Object obj) {
  13. System.out.println("checkProcessor>>>>>>>>>>" + obj.toString());
  14. }
  15. }
  16.  
  17. public class FinalProcessor extends AbstractProcessor{
  18.  
  19. @Override
  20. public void processor(Object obj) {
  21. System.out.println("finalProcessor>>>>>>>>>>" + obj.toString());
  22. }
  23. }

测试类:ProcessorMainTest

  1. public class ProcessorMainTest {
  2. public static void main(String[] args) {
  3. /**
  4. * 构建一个链路
  5. * paramsProcessor -> checkProcessor -> finalProcessor
  6. */
  7. AbstractProcessor paramsProcessor = new ParamsProcessor();
  8. AbstractProcessor checkProcessor = new CheckProcessor();
  9. AbstractProcessor finalProcessor = new FinalProcessor();
  10.  
  11. paramsProcessor.setNextProcessor(checkProcessor);
  12. checkProcessor.setNextProcessor(finalProcessor);
  13.  
  14. paramsProcessor.execute("Java责任链模式");
  15. }
  16. }

执行结果

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

三、异步责任链模式

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

在这里插入图片描述

抽象处理类:AbstractAsynProcessor

  1. /**
  2. * 异步责任链:采用线程、生产者消费者模式实现
  3. */
  4. public abstract class AbstractAsynProcessor extends Thread {
  5. // 用于存放当前责任链需要处理的对象
  6. protected BlockingQueue<Object> queue;
  7. // 链路对象
  8. private AbstractAsynProcessor nextProcessor;
  9.  
  10. /**
  11. * 执行
  12. *
  13. * @param obj
  14. */
  15. public void execute(Object obj) throws InterruptedException {
  16. this.processor(obj);
  17. if (this.nextProcessor != null) {
  18. this.nextProcessor.getQueue().put(obj);
  19. }
  20. }
  21.  
  22. @Override
  23. public void run() {
  24. // 执行
  25. try {
  26. while (true) {
  27. // 生产者消费者
  28. Object obj = this.queue.take();
  29. execute(obj);
  30. }
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35.  
  36. public abstract void processor(Object obj);
  37.  
  38. public BlockingQueue<Object> getQueue() {
  39. return queue;
  40. }
  41.  
  42. public void setNextProcessor(AbstractAsynProcessor nextProcessor) {
  43. this.nextProcessor = nextProcessor;
  44. }
  45. }

具体类:AsynParamsProcessor、AsynCheckProcessor、AsynFinalProcessor

  1. public class AsynParamsProcessor extends AbstractAsynProcessor {
  2.  
  3. public AsynParamsProcessor() {
  4. // 初始化队列
  5. this.queue = new LinkedBlockingQueue<>();
  6. }
  7.  
  8. @Override
  9. public void processor(Object obj) {
  10. System.out.println("asynParamsProcessor>>>>>>>>>>" + obj.toString());
  11. }
  12. }
  13.  
  14. public class AsynCheckProcessor extends AbstractAsynProcessor {
  15.  
  16. public AsynCheckProcessor(){
  17. this.queue = new LinkedBlockingQueue<>();
  18. }
  19.  
  20. @Override
  21. public void processor(Object obj) {
  22. System.out.println("asynCheckProcessor>>>>>>>>>>" + obj.toString());
  23. }
  24. }
  25.  
  26. public class AsynFinalProcessor extends AbstractAsynProcessor {
  27.  
  28. public AsynFinalProcessor() {
  29. this.queue = new LinkedBlockingQueue<>();
  30. }
  31.  
  32. @Override
  33. public void processor(Object obj) {
  34. System.out.println("asynFinalProcessor>>>>>>>>>>" + obj.toString());
  35. }
  36. }

测试类:AsynProcessorMainTest

  1. public class AsynProcessorMainTest {
  2. public static void main(String[] args) throws InterruptedException {
  3. /**
  4. * 构建一个链路
  5. * asynParamsProcessor -> asynCheckProcessor -> asynFinalProcessor
  6. */
  7. AbstractAsynProcessor asynParamsProcessor = new AsynParamsProcessor();
  8. asynParamsProcessor.start();
  9. AbstractAsynProcessor asynCheckProcessor = new AsynCheckProcessor();
  10. asynCheckProcessor.start();
  11. AbstractAsynProcessor asynFinalProcessor = new AsynFinalProcessor();
  12. asynFinalProcessor.start();
  13.  
  14. asynParamsProcessor.setNextProcessor(asynCheckProcessor);
  15. asynCheckProcessor.setNextProcessor(asynFinalProcessor);
  16.  
  17. Scanner input = new Scanner(System.in);
  18. while (true) {
  19. Thread.sleep(1000);
  20. System.out.print("请输入:");
  21. asynParamsProcessor.getQueue().put(input.next());
  22. }
  23. }
  24. }

执行结果

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

到此这篇关于Java 设计模式之责任链模式及异步责任链详解的文章就介绍到这了,更多相关Java 设计模式内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号