工作中责任链模式用法及其使用场景?

news/2024/5/15 12:57:26/文章来源:https://blog.csdn.net/weixin_45031612/article/details/129216229

前言

笔者是金融保险行业,有这么一种场景,业务员录完单后提交核保,这时候系统会对保单数据进行校验,如不允许手续费超限校验,客户真实性校验、费率限额校验等等,当校验一多时,维护起来特别麻烦,代码耦合度太高。

这里使用责任链模式,将每个校验模块之间互相独立,在后面新增校验时,只需要往容器中插入即可,且可以给每个模块赋予优选级进行排序,利于管理。与Spring框架结合,利于类的管理。

正文

在这里插入图片描述

处理器模板

public interface CheckProcessor {/*** 逻辑处理* @param policyInfo* @param exposeProcessor*/public void invoke(PolicyInfo policyInfo,ExposeProcessor exposeProcessor) throws Exception;
}

处理器实现类

手续费校验器

public class CommissionRateCheckProcessor implements CheckProcessor {@Overridepublic void invoke(PolicyInfo policyInfo, ExposeProcessor exposeProcessor) throws Exception {System.out.println("完成手续费校验");//调用下个处理器exposeProcessor.invoke(policyInfo);}
}

客户真实性校验器

public class CustomerCheckProcessor implements CheckProcessor {@Overridepublic void invoke(PolicyInfo policyInfo, ExposeProcessor exposeProcessor) throws Exception {System.out.println("完成客户真实性校验");//调用下个处理器exposeProcessor.invoke(policyInfo);}
}

保险费率校验器

public class PremiumRateCheckProcessor implements CheckProcessor {@Overridepublic void invoke(PolicyInfo policyInfo, ExposeProcessor exposeProcessor) throws Exception {System.out.println("完成保险费率校验");//调用下个处理器exposeProcessor.invoke(policyInfo);}
}

入口管理类

public class ExposeProcessor {private  int index;private  static List<CheckProcessor> processor=new ArrayList();static {setProcessor(new CustomerCheckProcessor());setProcessor(new CommissionRateCheckProcessor());setProcessor(new PremiumRateCheckProcessor());}/*** 处理器*/public  void invoke(PolicyInfo policyInfo) throws Exception {//获取容器中所有的处理器List processors = getProcessors();if (processors.size()==0||index==processors.size()){return;}//根据指针指向,调用处理器。并把指针指向下一个CheckProcessor processor = (CheckProcessor)processors.get(index++);//调用处理器processor.invoke(policyInfo,this);}/*** 处理器集*/private  List getProcessors(){return processor;}public static void setProcessor(CheckProcessor checkProcessor){processor.add(checkProcessor);}}
  1. 获取容器中的校验器
  2. 校验是否往下执行,如果处理器数量为空,或者当前指针已经指向尾部时,则不再往下执行
  3. 将管理器以及请求参数传递到处理器中进行处理
  4. 处理器执行完毕后,调用管理器的invoke方法来启动责任链中的下个处理器

测试用例

    public static void main(String[] args) {ExposeProcessor exposeProcessor=new ExposeProcessor();try {exposeProcessor.invoke(new PolicyInfo());} catch (Exception e) {e.printStackTrace();}}

在这里插入图片描述

以前代码有很多可以改进的地方,如与IOC框架结合,将每个处理器交给IOC容器进行管理,在获取处理器方法中可以直接从IOC容器中获取CheckProcessor 类型的所有实现类。

结合Spring IOC

@Service
public class ExposeProcessor implements ApplicationContextAware {private ApplicationContext applicationContext;private  int index;private  List<CheckProcessor> processor=new ArrayList();/*** 处理器*/public  void invoke(PolicyInfo policyInfo) throws Exception {List processors = getProcessors();if (processors.size()==0||index==processors.size()){return;}CheckProcessor processor = (CheckProcessor)processors.get(index++);processor.invoke(policyInfo,this);}/*** 处理器集*/private  List getProcessors(){Map<String, CheckProcessor> beansOfType = this.applicationContext.getBeansOfType(CheckProcessor.class);return beansOfType.values().stream().collect(Collectors.toList());}public void setProcessor(CheckProcessor checkProcessor){processor.add(checkProcessor);}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext=applicationContext;}
}
  1. 管理类实现ApplicationContextAware接口,并重写其setApplicationContext方法,将IOC上下文对象保存下来。
  2. 从IOC容器中获取类型为CheckProcessor 的类
  3. 将管理类加上@Service注解交由IOC容器进行管理
  4. 在所有的校验器实现类上都加上@Service注解,交由IOC容器管理

测试:

    public static void main(String[] args) {//创建Spring IOC容器,开启注解扫码AnnotationConfigApplicationContext annotationConfigApplicationContext=new AnnotationConfigApplicationContext("com.mashibing.dp.intepreter");//获取管理类ExposeProcessor exposeProcessor= (ExposeProcessor) annotationConfigApplicationContext.getBean("exposeProcessor");try {exposeProcessor.invoke(new PolicyInfo());} catch (Exception e) {e.printStackTrace();}}

由于项目非Spring web项目,所以必须启动Spring IOC容器,指定包路径对注解进行扫码,这样才能将类交由容器进行管理,不然获取会为空。

在这里插入图片描述

总结

责任链模式有多种写法,具体需要根据业务场景进行定制化开发。

责任链模式的优点:

  • 降低耦合度。它将请求的发送者和接收者解耦
  • 简化了对象。使得对象不需要知道链的结构。
  • 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
  • 增加新的请求处理类很方便。

责任链模式的缺点

  • 不能保证请求一定被接收。
  • 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
  • 可能不容易观察运行时的特征,有碍于除错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_76238.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

预览版Edge申请微软new Bing失败解决方案

文章目录1.首先需要配置科学上网2.下载预览版Edge浏览器卡它bug&#xff01;卡它bug&#xff01;卡它bug&#xff01;没有申请上ChatGPT的朋友们&#xff0c;试试new Bing吧&#xff0c;更新更强大&#xff0c;关于申请方式&#xff0c;网上已经有很多帖子了&#xff0c;其中一…

软件自动化测试工程师面试题集锦

以下是部分面试题目和我的个人回答&#xff0c;回答比较简略&#xff0c;仅供参考。不对之处请指出 1.自我介绍 答&#xff1a;姓名&#xff0c;学历专业&#xff0c;技能&#xff0c;近期工作经历等&#xff0c;可以引导到最擅长的点&#xff0c;比如说代码或者项目 参考&a…

SpringBoot入门 - SpringBoot HelloWorld

我们了解了SpringBoot和SpringFramework的关系之后&#xff0c;我们可以开始创建一个Hello World级别的项目了。创建 SpringBoot Web 应用为快速进行开发&#xff0c;推荐你使用IDEA这类开发工具&#xff0c;它将大大提升你学习和开发的效率。选择 Spring InitializeSpring提供…

Spring 事务(编程式事务、声明式事务@Transactional、事务隔离级别、事务传播机制)

文章目录1. 事务的定义2. Spring 中事务的实现2.1 MySQL 中使用事务2.2 Spring 中编程式事务的实现2.3 Spring 中声明式事务2.3.1 声明式事务的实现 Transactional2.3.2 Transactional 作用域2.3.3Transactional 参数设置2.3.4 Transactional 异常情况2.3.5 Transactional 工作…

一文读懂PaddleSpeech中英混合语音识别技术

语音识别技术能够让计算机理解人类的语音&#xff0c;从而支持多种语音交互的场景&#xff0c;如手机应用、人车协同、机器人对话、语音转写等。然而&#xff0c;在这些场景中&#xff0c;语音识别的输入并不总是单一的语言&#xff0c;有时会出现多语言混合的情况。例如&#…

ClickHouse进阶篇-多表连接物化视图

简介 在写这篇文章的时候doris 1.2 的物化视图只是支持单表建立物化视图&#xff0c;现在说下ClickHouse多表的物化视图。 前言 本文翻译自 Altinity 针对 ClickHouse 的系列技术文章。面向联机分析处理&#xff08;OLAP&#xff09;的开源分析引擎 ClickHouse&#xff0c;因…

全面了解 B 端产品设计 — 基础扫盲篇

在今天,互联网的影响力与作用与日俱增,除了我们日常生活领域的改变以外,对于商业领域的渗透也见效颇丰。 越来越多的企业开始使用数字化的解决方案来助力企业发展,包括日常管理、运营、统计等等。或者通过互联网的方式开发出新的业务形态,进行产业升级,如这几年风头正劲的…

ReentrantLock详说

目录 尝试加锁 如果加锁不成功 重点 尝试加锁 最外层lock方法 ReentrantLock.class public void lock() {sync.lock();} 进来发现是个抽象方法 abstract static class Sync extends AbstractQueuedSynchronizer abstract void lock(); 底下有两个实现类&#xff0c;一个…

Zookeeper3.5.7版本——Zookeeper的概述、工作机制、特点、数据结构及应用场景

目录一、Zookeeper的概述二、Zookeeper的工作机制三、Zookeeper的特点四、Zookeeper的数据结构五、Zookeeper的应用场景5.1、统一命名服务5.2、统一配置管理5.3、统一集群管理5.4、服务器动态上下线5.5、软负载均衡一、Zookeeper的概述 Zookeeper 是一个开源的分布式的&#x…

39万字完整版智能矿山项目建设整体解决方案

本资料来源网络&#xff0c;仅做知识分享&#xff0c;请勿商用。完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 1.1 总体技术要求 1.1.1 核心业务架构 智能矿山业务架构是在统一的标准与规范及安全运维保障体系下&#xff0c;按分层设计模式&#xff0c;分为设备层、…

【基于机器学习的推荐系统项目实战-1】初识推荐系统

本文目录一、为什么我们需要推荐系统&#xff1f;二、推荐系统的发展阶段三、推荐系统模型四、通用推荐系统框架4.1 数据生产4.2 数据存储4.3 算法召回4.4 结果排序4.5 结果应用4.6 新浪微博的框架开源结构图五、推荐常用特征5.1 用户特征5.2 物品特征六、推荐常用算法七、结果…

【自动化测试】一位自动化测试工程师居然不会封装框架?神秘自动化测试框架......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 自动化测试框架 自…

山寨APP频出?安全工程师和黑灰产在较量

在山寨这个领域&#xff0c;没有人比黑灰产更懂模仿。 据安全从业者介绍&#xff0c;一般而言&#xff0c;对于成熟的山寨开发者来说&#xff0c;几天时间内就可以做出一套前端框架。服务器、源代码、域名、服务商这些内容的创建&#xff0c;通过网上租赁的方式就可以解决。 比…

小红书“复刻”微信,微信“内造”小红书

配图来自Canva可画 随着互联网增长红利逐渐见顶&#xff0c;各大互联网平台对流量的争夺变得愈发激烈。而为了寻找新的业务可能性&#xff0c;各家都在不遗余力地拓宽自身边界。在此背景下&#xff0c;目前最为“吸睛”和“吸金”的社交、电商、种草、短视频等领域&#xff0c…

Qt音视频开发19-vlc内核各种事件通知

一、前言 对于使用第三方的sdk库做开发&#xff0c;除了基本的操作函数接口外&#xff0c;还希望通过事件机制拿到消息通知&#xff0c;比如当前播放进度、音量值变化、静音变化、文件长度、播放结束等&#xff0c;有了这些才是完整的播放功能&#xff0c;在vlc中要拿到各种事…

【vulhub漏洞复现】CVE-2018-2894 Weblogic任意文件上传漏洞

一、漏洞详情影响版本weblogic 10.3.6.0、weblogic 12.1.3.0、weblogic 12.2.1.2、weblogic 12.2.1.3WebLogic是美国Oracle公司出品的一个application server&#xff0c;确切的说是一个基于JAVAEE架构的中间件&#xff0c;WebLogic是用于开发、集成、部署和管理大型分布式Web应…

快速吃透π型滤波电路-LC-RC滤波器

π型滤波器简介 π型滤波器包括两个电容器和一个电感器&#xff0c;它的输入和输出都呈低阻抗。π型滤波有RC和LC两种&#xff0c; 在输出电流不大的情况下用RC&#xff0c;R的取值不能太大&#xff0c;一般几个至几十欧姆&#xff0c;其优点是成本低。其缺点是电阻要消耗一些…

计算机组成原理4小时速成6:输入输出系统,io设备与cpu的链接方式,控制方式,io设备,io接口,并行串行总线

计算机组成原理4小时速成6&#xff1a;输入输出系统&#xff0c;io设备与cpu的链接方式&#xff0c;控制方式&#xff0c;io设备&#xff0c;io接口&#xff0c;并行串行总线 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c…

操作系统——11.线程概念和多线程模型

这篇文章我们来讲一下操作系统中的线程概念和多线程模型 目录 1.概述 2.线程 2.1问题提出 2.2线程概念 2.3带来的变化 2.4线程的属性 2.5线程的实现方式 2.5.1用户级线程 2.5.2内核级线程 2.5.3相互组合 2.6多线程模型 2.6.1多对一模型 2.6.2一对一模型 2.6.3多…

linux代码库生成-make示例

1、add.c代码实现加法运算&#xff1a; int add(int a,int b) { return ab; } 2、头文件add.h #ifndef ADD_H #define ADD_H int add(int a,int b); #endif 3、CMakeLists.txt编写 cmake_minimum_required(VERSION 2.6) set(CMAKE_C_FLAGS -m32) project(test_add) include_dir…