设计模式【2】——责任链模式
一、责任链模式
责任链模式(英文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】——责任链模式相关推荐
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of ...
- php设计模式之责任链模式
php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...
- 轻松学习Java设计模式之责任链模式
我们的态度是:每天进步一点点,理想终会被实现. 前言 设计模式,可能很多人都是看到代码知道怎么回事,但是离开代码再让其说出来,估计就有点含糊其词了,包括我自己在内.Android中其实用到的设计模式也 ...
- 手撸设计模式之-责任链模式
手撸设计模式之-责任链模式 一 .责任链模式介绍 1.1 定义 1.2 责任链模式UML结构图 1.3 责任链模式结构详细 1.3 用例代码实现 二.责任链模式应用场景: 2.1 场景概述 2.2 场 ...
- 走穿java23种设计模式-15责任链模式详解
走穿java23种设计模式-15责任链模式详解 责任链模式是一种常见的行为模式. 一.责任链模式的现实场景 习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游 ...
- 软件设计模式之责任链模式实验
软件设计模式之责任链模式实验 一.实验目的 掌握软件责任链模式中的命令模式,能够用责任链模式编写程序,解决实际问题. 二.实验内容与要求 内容:某小学老师指定班里的三位学生收寒假作业,三位学生分别负责 ...
- Java设计模式之责任链模式(二)
所有设计模式传送门 本文将一起介绍学习下设计模式之责任链模式.责任链模式是指使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有 ...
- Java设计模式作业-责任链模式
Java设计模式作业-责任链模式:Web过滤器 文章目录 前言 一.类图 二.代码及测试结果 1.Trouble类 2.Support类 3.CharSupport类 4.TypeTransformS ...
- Java设计模式系列--责任链模式(应用)
原文网址:Java设计模式系列--责任链模式(应用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java设计模式中的责任链模式的一些使用场景. 责任链模式的好处 符合单一职责原则 每个功能 ...
- JAVA设计模式之责任链模式(职责链模式)
转自JAVA设计模式之责任链模式(职责链模式) 责任链/职责链(Chain of Responsibility)模式的定义 为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理 ...
最新文章
- SharePoint 2007 Features
- 树莓派和windows的FileZillla文件共享,补充:树莓派图形Xrdp界面登录
- Leecode 21. 合并两个有序链表——Leecode大厂热题100道系列
- 原来文化设计可以这样玩!
- codable swift_使用Codable进行Swift JSON解析
- Spring MVC基础环境搭建
- Kafka 多种跨 IDC 灾备方案调研对比
- Fortran入门教程(六)——循环结构
- 梦工厂将在红帽峰会畅谈云计算心得
- php圆形设计图,教程|PHP如何制作圆形用户头像?
- java宠物商店_Java如何实现宠物商店管理 Java实现宠物商店管理代码示例
- 计算机核心论文如何审稿,2021年,审稿快、好中的核心期刊有哪些?
- android 自启动权限,引导用户开启开机自启动权限
- 数据挖掘实验二结果(构建cube的三个维度,即三个txt,然后做各种查询)C++实现(代码调试环境为Windows下的CLion使用WSL的Linux)
- tmux 使用鼠标上下滚动
- 使用卷积神经网络进行图片分类 2
- ncbi-genome-download在NCBI上批量下载基因组
- “古董级” 诺基亚功能机跑Linux是怎样的画风?
- 关于“马甲app”你不得不知的一些常识
- 阿德莱德大学计算机科学学士排名,2020年阿德莱德大学计算机科学学士就业前景,入学要求介绍...