一、责任链模式

责任链模式(英文Chain of Responsibility Pattern),通过创建一个链式调用,来处理请求,将请求的发送者和接受者进行解耦,符合设计模式原则。一般在过滤器、拦截器中比较常见,例如Servlet中的Filter 就是典型的责任链模式。

二、优缺点

  • 优点:

    • 请求和接收解耦
    • 实现统一的接口即可
    • 拓展新的过滤条件很方便
  • 缺点:
    • 可能出现错误后不方便排查
    • 不能动态调整后面的过滤是否执行

三、示例代码

日常开发中,我们需要根据多个复杂的条件(自己想象)进行过滤判断,例如需求的时效性,可用性,复杂度进行判断是否可行(虽然每次都是可行的)。这时,我们就可以使用责任链的模式来处理,对每个条件进行判断,遇到不符合的条件就可以认为该需求做不了。

1、首先,新建一个过滤接口,里面定义一个用于过滤的方法,参数是封装的条件对象vo,返回值是布尔值,提供给外部流程,用于判断当前的判断条件是否需要过滤。

package com.test.service;import com.test.vo.ConditionVo;public interface FilterService {/*** 用于过滤的方法** @param conditionVo 封装条件* @return 返回是否继续进行的布尔值*/boolean filter(ConditionVo conditionVo);
}

2、这里举例对长度,宽度的条件判断

package com.test.vo;import lombok.Data;@Data
public class ConditionVo {String name;Integer age;Long Width;Long Height;
}

3、具体的过滤实现,可以通过实现接口,在filter里面加上相应的判断逻辑,通过@Service注解,Spring就可以获取到。例如下面对长度和宽度进行判断。

package com.test.service.Impl;import com.test.service.FilterService;
import com.test.vo.ConditionVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;@Service
public class WidthFilterService implements FilterService {public static final Logger LOGGER = LoggerFactory.getLogger(WidthFilterService.class);@Overridepublic boolean filter(ConditionVo conditionVo) {// filter conditionLOGGER.info("width condition filter.");// return resultreturn true;}
}
package com.test.service.Impl;import com.test.service.FilterService;
import com.test.vo.ConditionVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;@Service
public class HeightFilterService implements FilterService {public static final Logger LOGGER = LoggerFactory.getLogger(HeightFilterService.class);@Overridepublic boolean filter(ConditionVo conditionVo) {// filter conditionLOGGER.info("height condition filter.");// return resultreturn true;}
}

4、过滤器的获取,可以通过@Autowired 注解的List<FilterService> 来拿到,这是因为spring 会将所有实现FilterService接口的实现类放到里面。这样循环执行filter即可,如果过滤条件没有卡到,那就可以接着执行下面的逻辑代码。

package com.test.service;import com.test.vo.ConditionVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;import java.util.List;@Component
public class ApplicationExec implements ApplicationRunner {public static final Logger LOGGER = LoggerFactory.getLogger(ApplicationExec.class);@Autowiredprivate List<FilterService> filterServiceList;@Overridepublic void run(ApplicationArguments applicationArguments) throws Exception {LOGGER.info("filter exec start.");ConditionVo conditionVo = new ConditionVo();filterServiceList.forEach(filterService -> {if (!filterService.filter(conditionVo)) {LOGGER.info("be filtered , skip now.");return;}});LOGGER.info("filter exec end.");// continue hand}
}
package com.test;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@ComponentScan
@SpringBootApplication
public class SpringProjectApplication {public static void main(String[] args) {SpringApplication.run(SpringProjectApplication.class, args);}
}

5、如果这时需要增加一种新的判断,例如对年龄的判断,那我们再实现FilterService接口即可,然后为实现类加上注解,spring就能够自动获取到相应的类。

package com.test.service.Impl;import com.test.service.FilterService;
import com.test.vo.ConditionVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;@Service
public class AgeFilterService implements FilterService {public static final Logger LOGGER = LoggerFactory.getLogger(AgeFilterService.class);@Overridepublic boolean filter(ConditionVo conditionVo) {// filter conditionLOGGER.info("age condition filter.");// return resultreturn true;}
}

6、启动SpringBoot工程后,查看日志,可以看到三个过滤条件都能正常执行到。

*欢迎关注我的公众号Godyvvva,回复Spark资料免费获取Spark学习资料,需要自取,过时不候。

设计模式【2】——责任链模式相关推荐

  1. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of ...

  2. php设计模式之责任链模式

    php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...

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

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

  4. 手撸设计模式之-责任链模式

    手撸设计模式之-责任链模式 一 .责任链模式介绍 1.1 定义 1.2 责任链模式UML结构图 1.3 责任链模式结构详细 1.3 用例代码实现 二.责任链模式应用场景: 2.1 场景概述 2.2 场 ...

  5. 走穿java23种设计模式-15责任链模式详解

    走穿java23种设计模式-15责任链模式详解 责任链模式是一种常见的行为模式. 一.责任链模式的现实场景 习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游 ...

  6. 软件设计模式之责任链模式实验

    软件设计模式之责任链模式实验 一.实验目的 掌握软件责任链模式中的命令模式,能够用责任链模式编写程序,解决实际问题. 二.实验内容与要求 内容:某小学老师指定班里的三位学生收寒假作业,三位学生分别负责 ...

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

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

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

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

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

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

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

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

最新文章

  1. SharePoint 2007 Features
  2. 树莓派和windows的FileZillla文件共享,补充:树莓派图形Xrdp界面登录
  3. Leecode 21. 合并两个有序链表——Leecode大厂热题100道系列
  4. 原来文化设计可以这样玩!
  5. codable swift_使用Codable进行Swift JSON解析
  6. Spring MVC基础环境搭建
  7. Kafka 多种跨 IDC 灾备方案调研对比
  8. Fortran入门教程(六)——循环结构
  9. 梦工厂将在红帽峰会畅谈云计算心得
  10. php圆形设计图,教程|PHP如何制作圆形用户头像?
  11. java宠物商店_Java如何实现宠物商店管理 Java实现宠物商店管理代码示例
  12. 计算机核心论文如何审稿,2021年,审稿快、好中的核心期刊有哪些?
  13. android 自启动权限,引导用户开启开机自启动权限
  14. 数据挖掘实验二结果(构建cube的三个维度,即三个txt,然后做各种查询)C++实现(代码调试环境为Windows下的CLion使用WSL的Linux)
  15. tmux 使用鼠标上下滚动
  16. 使用卷积神经网络进行图片分类 2
  17. ncbi-genome-download在NCBI上批量下载基因组
  18. “古董级” 诺基亚功能机跑Linux是怎样的画风?
  19. 关于“马甲app”你不得不知的一些常识
  20. 阿德莱德大学计算机科学学士排名,2020年阿德莱德大学计算机科学学士就业前景,入学要求介绍...

热门文章

  1. Spring源码解析之-doCreateBean() 详解
  2. Linux创建shell脚本文件
  3. Linux消息队列的设置及查看
  4. Hp-Socket高性能网络库介绍零--整体结构
  5. 经验模态分解python_经验模态分解法简析 (转)
  6. 软件开发中三员管理职责
  7. 百度计算机视觉算法工程师面试题(秋招)
  8. 如何把谷歌浏览器设置成全黑主题
  9. linux 如何安装whl文件,linux安装whl文件
  10. SQL Server 双机热备份-实现主从复制