前言:

责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿着这条链传递该请求。

网上有很多朋友已经对该模式介绍的非常详细了,也有案例帮助理解,可参考

Java设计模式之职责链模式

一篇文章搞懂Java设计模式之责任链模式_lzy_tinyjoy-CSDN博客_java责任链模式

但是这两篇文章的案例中,对象与对象之间是有先后顺序的,即请求需要先发给组长,再发给经理,不能调换顺序,但是生活中和我们实际开发过程中,对象与对象之间也可以是平行关系,就像产品在流水线上做检查一样,先检查哪一部分都可以,任何一部分有问题,即可返回,不再往后检查。

本篇文章就是在上面两篇文章上做了改进,改成对象与对象之间是相互独立的并列关系。相比于第一篇文章,增加了处理器对象可动态配置功能。相比于第二篇文章,例子通俗易懂,请求简单化(有些场景不需要对请求进一步封装)。

代码示例:

该场景描述的是一个待检产品在流水线上检查,产品有两个属性,长度和宽度,流水线上的处理节点也有两个,即长度检查节点和宽度检查节点。为帮助理解,该场景设置的较为简单,实际开发工作中,待检查对象(请求)可以为上下文对象,附带较多属性,同时检查处理节点也可有多个,它们之间是相互独立的。

产品定义

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 待检验产品*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Product {/*** 产品长度*/Integer length;/*** 产品宽度*/Integer width;
}

处理器执行链定义,责任链的核心在于此

import java.util.ArrayList;
import java.util.List;public class ProcessorChain{// 保存处理节点private List<Processor> processorList = new ArrayList<>();// 处理节点下标private int index = 0;// 动态扩展处理节点public ProcessorChain addProcessor(Processor processor) {processorList.add(processor);return this;}// 获取处理器处理public boolean process(Product product, ProcessorChain chain) {if(index == processorList.size()) {return true;}Processor processor = processorList.get(index);index++;return processor.process(product, chain);}}

处理器接口定义

public interface Processor {boolean process(Product request, ProcessorChain chain);
}

长度检查处理器和宽度检查处理器

public class LengthCheckProcessor implements Processor{@Overridepublic boolean process(Product request, ProcessorChain chain) {Integer length = request.getLength();if (length < 100 && length > 50) {System.out.println("产品长度检验通过");return chain.process(request, chain);}// 产品长度未检验通过System.out.println("产品长度未检验通过");return false;}
}
public class WidthCheckProcessor implements Processor{@Overridepublic boolean process(Product request, ProcessorChain chain) {Integer width = request.getWidth();if (width < 100 && width > 50) {System.out.println("产品宽度检验通过");return chain.process(request, chain);}// 产品宽度未检验通过System.out.println("产品宽度未检验通过");return false;}
}

客户端

public class Main {public static void main(String[] args) {int[][] arrays = {{60, 60}, {40, 40}, {40, 60}, {60, 40}};for (int[] array : arrays) {ProcessorChain processorChain = new ProcessorChain();processorChain.addProcessor(new LengthCheckProcessor());processorChain.addProcessor(new WidthCheckProcessor());Product product = new Product(array[0], array[1]);boolean checkResult = processorChain.process(product, processorChain);if(checkResult) {System.out.println("产品最终检验合格");} else {System.out.println("产品最终检验不合格");}System.out.println();}}
}

结果:

产品长度检验通过
产品宽度检验通过
产品最终检验合格产品长度未检验通过
产品最终检验不合格产品长度未检验通过
产品最终检验不合格产品长度检验通过
产品宽度未检验通过
产品最终检验不合格

总结与改进:

1. 每个处理器可以通过注解扫描的方式添加进执行链中,不必在客户端中人为添加,只需自己定义处理器,实现处理器接口,添加该处理器的执行逻辑。

2. 待处理的请求对象可以是上下文对象,上下文对象中封装待检查条件,并将检查结果写入到上下文对象中。

如有问题,欢迎指正。也可加QQ 2422035338沟通交流。

参考:

1.  https://segmentfault.com/a/1190000014940291

2. 一篇文章搞懂Java设计模式之责任链模式_lzy_tinyjoy-CSDN博客_java责任链模式

Java设计模式之责任链模式(简单易懂)相关推荐

  1. Java设计模式作业-责任链模式

    Java设计模式作业-责任链模式:Web过滤器 文章目录 前言 一.类图 二.代码及测试结果 1.Trouble类 2.Support类 3.CharSupport类 4.TypeTransformS ...

  2. Java设计模式系列--责任链模式(应用)

    原文网址:Java设计模式系列--责任链模式(应用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java设计模式中的责任链模式的一些使用场景. 责任链模式的好处 符合单一职责原则 每个功能 ...

  3. JAVA设计模式之责任链模式(职责链模式)

    转自JAVA设计模式之责任链模式(职责链模式)​​​​​​​ 责任链/职责链(Chain of Responsibility)模式的定义 为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理 ...

  4. 轻松学习Java设计模式之责任链模式

    我们的态度是:每天进步一点点,理想终会被实现. 前言 设计模式,可能很多人都是看到代码知道怎么回事,但是离开代码再让其说出来,估计就有点含糊其词了,包括我自己在内.Android中其实用到的设计模式也 ...

  5. Java设计模式之责任链模式(二)

    所有设计模式传送门 本文将一起介绍学习下设计模式之责任链模式.责任链模式是指使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有 ...

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

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

  7. JAVA设计模式之责任链模式

    责任链模式在设计模式里边属于比较难的设计模式,主要用于对一个对象进行一系列的操作,每个操作相互独立.这一系列的操作组成了一个操作链,每个操作都有其具体的职责,即是一个责任链. UML图如下 先用一个简 ...

  8. Java 设计模式之责任链模式实现的三种方式

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 The worst way to miss someone is to be ...

  9. Java设计模式:责任链模式

    本文是自己的学习笔记,主要参考以下资料 - 大话设计模式,程杰著,清华大学出版社出版 - 马士兵教育 1.责任链应用场景 2.代码详解 2.1.建立责任链结点的抽象类 2.2.责任链结点的具体实现类 ...

最新文章

  1. 昨天死线程的问题又找到了别的原因
  2. python中try Except抛出异常使用方法
  3. 【转载】ogre内存管理
  4. java加密工作模式None_java加解密算法--对称加密工作模式
  5. c语言 指针_C语言——指针
  6. 软件測试之独步武林系列(一)
  7. 深度链接对社会化营销有哪些价值和作用?
  8. MXNet下载Fashion-MNIST错误处理
  9. S03_CH03_AXI_DMA_OV7725摄像头采集系统
  10. python配置文件模块_Python解析配置文件模块:ConfigPhaser
  11. 不想再被鄙视?那就看进来! 一文搞懂Python2字符编码
  12. python:whl包离线下载,pip离线安装whl文件
  13. C语言求素数,以及优化
  14. 探索无止境,解决问题才是根本
  15. win7、win10安装Microsoft Loopback 接口
  16. 1044: 又要种树?
  17. 人脸识别之人脸检测(二)--人脸识别样本制作及训练测试
  18. P1061 [NOIP2006 普及组] Jam 的计数法
  19. Flutter 递归查询Map(字典)
  20. NXP LS1046A及飞腾新四核 FT2004 PCIE EP端LINUX设备驱动开发

热门文章

  1. 冯诺依曼计算机相关资料,冯诺依曼计算机的基本内容
  2. 到底大前端是什么 一般大前端技术有哪些
  3. Git 分布式版本控制工具01:Git介绍+下载+安装
  4. 【UE】制作简单的山脉地形
  5. 现在跨平台开发(手机平台,主要是Android、iOS以及WP)工具或者技术都有哪些?有哪些优缺点和发展前景如何?
  6. 加速度传感器BMA250E的驱动
  7. it业创业的经验之谈
  8. stats | 聚类分析之系统聚类法
  9. apple store 慢_建议改善与Apple Store(以及一般的Cloud Services)的客户互动
  10. Buy Figurines