最近看到责任链模式的时候每增加一个处理类,就必须在责任链的实现类中手动增加到责任链中,具体代码基本就是list.add(new FilterImpl()),可以看到每次增加一个处理类,就必须添加一行上面的代码,不符合开闭原则(面向修改关闭,面向扩展开放)。于是想到了Java的SPI机制,可以实现插拔式组件,而Java自带的SPI机制是寻找借口的所有实现类,虽然一直被诟病,但是在本次的插拔式中,它却成了一个优点,因为我们需要把所有的实现类都放入处理器链中。

类图如下:

上代码,嘻嘻!

1 packagecom.liekkas.spi.responsibility_chain_model;2

3 importlombok.Data;4

5 /**

6 * description 被处理的类7 *8 *@authorliekkas 2020/12/02 23:339 */

10 @Data11 public classReceipt {12 publicReceipt(String code,String message){13 this.code =code;14 this.message =message;15 }16 privateString code;17 privateString message;18 }

1 packagecom.liekkas.spi.responsibility_chain_model;2

3 /**

4 * description 处理器接口5 *6 *@authorliekkas 2020/12/02 23:307 */

8 public interfaceFilter {9

10 /**

11 * 处理方法12 *@paramreceipt receipt13 *@paramfilterChain filterChain14 */

15 voidhandle(Receipt receipt,FilterChain filterChain);16 }

1 packagecom.liekkas.spi.responsibility_chain_model;2

3 /**

4 * description 处理器链接口5 *6 *@authorliekkas 2020/12/02 23:317 */

8 public interfaceFilterChain {9

10 /**

11 * 处理方法12 *@paramreceipt receipt13 */

14 voidhandleReceipt(Receipt receipt);15 }

1 packagecom.liekkas.spi.responsibility_chain_model.impl;2

3 importcom.liekkas.spi.responsibility_chain_model.Filter;4 importcom.liekkas.spi.responsibility_chain_model.FilterChain;5 importcom.liekkas.spi.responsibility_chain_model.Receipt;6

7 /**

8 * description 具体的处理器19 *10 *@authorliekkas 2020/12/02 23:3511 */

12 public class FilterImpl1 implementsFilter {13

14 @Override15 public voidhandle(Receipt receipt, FilterChain filterChain) {16 if ("test001".equals(receipt.getCode())) {17 System.out.println("我是Filter1,我能处理test001,已经处理" +receipt.getMessage());18 }19 //自己处理不了该回执就往下传递

20 else{21 filterChain.handleReceipt(receipt);22 }23 }24 }

1 packagecom.liekkas.spi.responsibility_chain_model.impl;2

3 importcom.liekkas.spi.responsibility_chain_model.Filter;4 importcom.liekkas.spi.responsibility_chain_model.FilterChain;5 importcom.liekkas.spi.responsibility_chain_model.Receipt;6

7 /**

8 * description 具体的处理器29 *10 *@authorliekkas 2020/12/02 23:3511 */

12 public class FilterImpl2 implementsFilter {13

14 @Override15 public voidhandle(Receipt receipt, FilterChain filterChain) {16 if ("test002".equals(receipt.getCode())) {17 System.out.println("我是Filter2,我能处理test002,已经处理" +receipt.getMessage());18 }19 //自己处理不了该回执就往下传递

20 else{21 filterChain.handleReceipt(receipt);22 }23 }24 }

1 packagecom.liekkas.spi.responsibility_chain_model.impl;2

3 importcom.liekkas.spi.responsibility_chain_model.Filter;4 importcom.liekkas.spi.responsibility_chain_model.FilterChain;5 importcom.liekkas.spi.responsibility_chain_model.Receipt;6

7 /**

8 * description 具体的处理器39 *10 *@authorliekkas 2020/12/02 23:3511 */

12 public class FilterImpl3 implementsFilter {13

14 @Override15 public voidhandle(Receipt receipt, FilterChain filterChain) {16 if ("test003".equals(receipt.getCode())) {17 System.out.println("我是Filter3,我能处理test003,已经处理" +receipt.getMessage());18 }19 //自己处理不了该回执就往下传递

20 else{21 filterChain.handleReceipt(receipt);22 }23 }24 }

1 packagecom.liekkas.spi.responsibility_chain_model.impl;2

3 importcom.liekkas.spi.responsibility_chain_model.Filter;4 importcom.liekkas.spi.responsibility_chain_model.FilterChain;5 importcom.liekkas.spi.responsibility_chain_model.Receipt;6 importcom.liekkas.spi.responsibility_chain_model.container.ReceiptHandlerContainer;7

8 importjava.util.List;9

10 /**

11 * description 处理器链默认的实现类12 *13 *@authorliekkas 2020/12/02 23:3814 */

15 public class DefaultFilterChainImpl implementsFilterChain {16

17 /**

18 * 记录当前处理者位置19 */

20 private int index = 0;21 /**

22 * 处理器集合23 */

24 private static final ListFILTER_LIST;25

26 static{27 //从容器中获取处理器对象

28 FILTER_LIST =ReceiptHandlerContainer.getReceiptHandlerList();29 }30

31 @Override32 public voidhandleReceipt(Receipt receipt) {33 if (FILTER_LIST != null && FILTER_LIST.size() > 0) {34 if (index

1 packagecom.liekkas.spi.responsibility_chain_model.container;2

3 importcom.liekkas.spi.responsibility_chain_model.Filter;4

5 importjava.util.ArrayList;6 importjava.util.List;7 importjava.util.ServiceLoader;8

9 /**

10 * description 装在过滤器的容器,采用SPI实现,当添加过滤器的时候只需按照SPI的格式要求,便可自动装载,11 * 无需其他操作,即实现了插拔式,即插即用。12 *13 *@authorliekkas 2020/12/02 23:4314 */

15 public classReceiptHandlerContainer {16 privateReceiptHandlerContainer() {17 }18

19 public static ListgetReceiptHandlerList() {20 //SPI机制,寻找所有的实现类

21 ServiceLoader filtersImplements = ServiceLoader.load(Filter.class);22 List receiptHandlerList = new ArrayList<>();23 //把找到的所有的Filter的实现类放入List中

24 for(Filter filtersImplement : filtersImplements) {25 receiptHandlerList.add(filtersImplement);26 }27 returnreceiptHandlerList;28 }29 }

最后在resources目录下建一个文件名为com.liekkas.spi.responsibility_chain_model.Filter的文件,文件名即是接口的全限定接口名,完整的目录如下:

src/main/resources/META-INF/services/com.liekkas.spi.responsibility_chain_model.Filter

文件内容为:

com.liekkas.spi.responsibility_chain_model.impl.FilterImpl1

com.liekkas.spi.responsibility_chain_model.impl.FilterImpl2

com.liekkas.spi.responsibility_chain_model.impl.FilterImpl3

下面我们就建一个客户端的测试类,来看一下效果,激动人心的时刻到了,嘿嘿嘿

packagecom.liekkas.spi.responsibility_chain_model;importcom.liekkas.spi.responsibility_chain_model.impl.DefaultFilterChainImpl;importjava.util.ArrayList;importjava.util.List;/*** description 测试客户端

*

*@authorliekkas 2020/12/02 23:52*/

public classClient {public static voidmain(String[] args) {//模拟回执

List receiptList =ReceiptBuilder.generateReceiptList();for(Receipt receipt : receiptList) {//回执处理链对象

FilterChain receiptHandleChain = newDefaultFilterChainImpl();

receiptHandleChain.handleReceipt(receipt);

}

}static classReceiptBuilder{public static ListgenerateReceiptList(){

List resultList = new ArrayList<>();

resultList.add(new Receipt("test001","测试消息one"));

resultList.add(new Receipt("test002","测试消息two"));

resultList.add(new Receipt("test003","测试消息three"));returnresultList;

}

}

}

执行的结果如下:

小结:通过本次的学习,不仅对责任链模式有了更深的理解也对SPI机制有了更深的理解,同时两者的结合实现了插拔式,也让我对软件的设计原则有了更深一步的认识!

java spi 热插拔_利用SPI机制实现责任链模式中的处理类热插拔相关推荐

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

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

  2. 一篇文章搞懂Java设计模式之责任链模式

    简述: 前端时间再看一些类库的源码,发现责任链模式的强大之处,尤其是和建造者模式的结合后强大的动态可扩展性更是牛逼的一塌糊涂.接下来赶紧了解一下吧! 我们先来了解一下什么是责任链模式: 职责链模式(C ...

  3. java责任链模式审批请假_Java使用责任链模式处理学生请假问题详解

    本文实例讲述了Java使用责任链模式处理学生请假问题.分享给大家供大家参考,具体如下: 一. 模式定义 在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来,形成一条链.客户端应用请求在这个链 ...

  4. java责任链模式审批请假_14-学生生病请假:责任链模式

    14.1 请假流程 学生生病了,需要请假,写了请假条交给班长处理.假如此时有三种情况: 1)是小病需要请假时间短,班长能够处理,就批准请假,否则交给老师处理: 2)老师实际查看学生的情况,如果可以处理 ...

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

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

  6. 【Java 责任链模式实例】

    责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送,直到有一个处理者处理它为止.在责任链模式中,每个处理者都是相互独立的对象,并且每个处理者都负责对请求进行处理.如果当前处理者不能处理请 ...

  7. java语言描述一个行为_设计模式之责任链模式——Java语言描述

    责任链模式为请求创建了一个接受者对象的链.这种模式给予请求的类型,对请求的发送者和接受者进行解耦.这种类型的设计模式属于行为模式.在这种模式下,通常每个接收者都包含对另一个接收者的引用.如果一个对象不 ...

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

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

  9. 设计模式--责任链模式--Java实现

    设计模式–责任链模式–Java实现 责任链模式–链式数据结构–内存消耗–Java的awt事件一开始用责任链模式后来改为观察者模式–为什么呢?–现在的应用–dom事件–异常处理机制-过滤器链–等等 学习 ...

  10. Java 设计模式-责任链模式

    1.定义 责任链模式是一种行为设计模式,允许你将请求沿着处理链发送,然后处理者都可对其进行处理,完成后可以再将其传递给下一个处理者. 可以控制请求的处理的顺序 单一职责原则,可以对发起操作和执行操作的 ...

最新文章

  1. python elasticsearch 更新后刷新
  2. Oracle Enterprises Manager 12C安装
  3. java launcher 下载_Java Launcher下载并安装
  4. On Comparing Side-Channel Preprocessing Techniques for Attacking RFID Devices
  5. 0基础lua学习(二十)Lua单例
  6. Canvas简单动画和像素处理
  7. poj2594 Treasure Exploration 二分匹配之最小路径覆盖+传递闭包
  8. 只需要这三个步骤让你轻松搞定Maya中贴hdr贴图
  9. 迪普应用防火墙产品线
  10. ong拼音汉字_汉语拼音ang-ong(教案)
  11. docker安装nessus
  12. gateway 动态路由
  13. 点亮显示屏的几个重要步骤
  14. pytho sockt编程
  15. 人工智能(Artificial Intelligence-AI)、机器学习(Machine Learning)、深度学习(Deep Learning)之间区别
  16. 阿里云服务器的公网ipv6地址申请与配置
  17. 如何对需求进行排序?
  18. String的方法介绍以及实现
  19. Handlebars.js的下载及使用示例
  20. xp无法搜索计算机,xp系统的笔记本电脑为什么搜不到手机热点的信号

热门文章

  1. 深入浅出MFC:Windows程序的生与死
  2. 每周分享第 58 期
  3. 我和腾讯不得不说的故事
  4. Python语言程序设计基础_实验5 序列型数据_答案_通识教育必修课程_上海师范大学
  5. 【Python】Python 基本函数与操作-适合Python入门
  6. 人工智能在金融行业的应用
  7. MIPI DSI CLK计算
  8. openid是什么意思?token是什么意思?
  9. 东华大学计算机学院推免名单,东华大学2020年接收推荐免试攻读硕士研究生预申请公告...
  10. 工信部发布2015年中国软件业务收入百强发展报告(zz)