首页 > 其他分享 >设计模式之责任链模式

设计模式之责任链模式

时间:2024-08-22 18:49:25浏览次数:9  
标签:执行器 模式 责任 Employee employee 设计模式 com public

责任链模式是面向对象的23种设计模式中的一种,属于行为模式范围。
责任链模式(Chain of Responsibility),
见名知意:就是每一个处理请求的处理器组合成一个链表,链表中的每个节点(执行器)都有机会处理发送的请求。

大致的结构是这个样子:

 


举一个简单的例子:
某公司有一名新员工要入职,则入职过程大致分为三步:
1、签订劳动合同
2、员工信息入库
3、下发工卡
我们按照责任链模式的思路来设计这块业务:

类图如下:

代码如下:

处理器接口

1 package com.example.demo.learn.pattern.behavior.responsibilitychain;
2 
3 public interface IHandler {
4     boolean handle(Employee employee);
5 }

合同处理器

 1 package com.example.demo.learn.pattern.behavior.responsibilitychain;
 2 
 3 /**
 4  * @discription
 5  */
 6 public class CardHandler implements IHandler{
 7     @Override
 8     public boolean handle(Employee employee) {
 9         System.out.println("制作工牌:工号"+employee.getId()+" 姓名:"+employee.getName());
10         return true;
11     }
12 }

协议处理器

 1 package com.example.demo.learn.pattern.behavior.responsibilitychain;
 2 
 3 /**
 4  * @discription
 5  */
 6 public class ContractHandler implements IHandler {
 7     @Override
 8     public boolean handle(Employee employee) {
 9         System.out.println("签订合同:" + employee);
10         return true;
11     }
12 }

系统流程处理器

 1 package com.example.demo.learn.pattern.behavior.responsibilitychain;
 2 
 3 import java.util.Date;
 4 
 5 /**
 6  * @discription
 7  */
 8 public class SystemHandler implements IHandler {
 9     @Override
10     public boolean handle(Employee employee) {
11         long id = new Date().getTime();
12         employee.setId(id);
13         System.out.println("员工信息登入到系统中: " + employee);
14         return true;
15     }
16 }

员工类:业务实体

 1 package com.example.demo.learn.pattern.behavior.responsibilitychain;
 2 
 3 import lombok.Data;
 4 
 5 /**
 6  * @discription
 7  */
 8 @Data
 9 public class Employee {
10     private Long id;
11     private String name;
12 }

主类:责任链的编排和请求调用

 1 package com.example.demo.learn.pattern.behavior.responsibilitychain;
 2 
 3 /**
 4  * @discription
 5  */
 6 public class PatternMain {
 7     public static void main(String[] args) {
 8         ContractHandler contractHandler = new ContractHandler();
 9         SystemHandler systemHandler = new SystemHandler();
10         CardHandler cardHandler = new CardHandler();
11 
12 
13         EntryChain entry = new EntryChain(contractHandler, systemHandler, cardHandler);
14         String name = "小z";
15         boolean result = entry.process(name);
16         if (result) {
17             System.out.println(name + "的入职流程已经处理完");
18         }
19     }
20 }

执行效果如下:

Connected to the target VM, address: '127.0.0.1:63269', transport: 'socket'
签订合同:Employee(id=null, name=小z)
员工信息入库: Employee(id=1724316937102, name=小z)
制作工牌:工号1724316937102 姓名:小z
小z的入职流程已经全部处理完
Disconnected from the target VM, address: '127.0.0.1:63269', transport: 'socket'

来具体说下设计的核心思路:

首先我们需要定义好一个接口,这个接口规范每一个执行器(责任链节点)的执行方法。在本例中就是IHandler接口。
接着我们定义3个实现类(也就是所谓的执行器,即责任链的节点),(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )每个执行器中实现接口的方法,编写当前执行器要做的事。
最后我们需要一个链表来编排当前各个执行器的执行顺序。
当我们将请求下发,系统就可以按照责任链编排的顺序,依次执行了。
有些文章也这样定义:
抽象接口---->抽象处理器(Handler)角色
具体执行器实现---->具体处理者(ConcreteHandler)角色

责任链模式一般应用在:
1、流程编排(如电子流工单处理)
2、资源的使用(依次申请资源--->使用资源--->释放资源)
3、日志记录、权限过滤、请求预处理 (如在aop切面编程执行顺序的编排)

那么为啥要搞责任链模式呢?
我们直接从头到尾写一套流程不就行了么,这样还比较直接,易懂。
如果是简单的使用,那么肯定是可以的,但是如果要是业务流程复杂,又经常变动,以满足开闭原则为初衷,则从头到尾写一套流程就很难维护了。
所以我们可以将各个执行节点(执行器)为对象,按照具体场景,随意的调整顺序,随意的增加新的场景。从这个角度看,是不是逐渐就有了一点面向对象的意思。

设计模式除了举得这个简单的例子外,还有很多的变形:
1、有些场景将责任链的节点,保存在每一个责任链节点的next引用处,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )从而形成一个逻辑上的单链表结构,而不是依赖某一个list来保存。
2、责任链模式既可以从中途结束返回,也可以依次的每个节点都执行,这个没有强制的约束。
3、责任链模式是一个整体的设计思路,并不是某几个固定方法,比如我们的OA流程,就是一个大的流程,可能跨多个服务,并不是某几个方法简单编排一下就可以的。
那么我们应该怎么掌握呢?个人觉得设计模式本来就是一个设计思路,没必要条条框框,按部就班的来。要根据核心思路,以实际情况为场景,来灵活的实现和使用。

标签:执行器,模式,责任,Employee,employee,设计模式,com,public
From: https://www.cnblogs.com/jilodream/p/18374509

相关文章

  • Flannel Wireguard 模式
    FlannelWireGuard模式一、环境信息主机IPubuntu172.16.94.141软件版本docker26.1.4helmv3.15.0-rc.2kind0.18.0clab0.54.2kubernetes1.23.4ubuntuosUbuntu20.04.6LTSkernel5.11.5内核升级文档二、安装服务kind配置......
  • Flannel IPsec 模式
    FlannelIPSec模式一、环境信息主机IPubuntu172.16.94.141软件版本docker26.1.4helmv3.15.0-rc.2kind0.18.0clab0.54.2kubernetes1.23.4ubuntuosUbuntu20.04.6LTSkernel5.11.5内核升级文档二、安装服务kind配置文件......
  • 分布式事务的Seata AT模式原理
    Seata官网地址:https://seata.apache.org/zh-cn/AT模式优点:无侵入式代码,只需要添加注解,底层采用Seata代理的数据源DataSourceProxy缺点:依赖于数据库,目前只适用于postgresql、oracle、mysql、polardb-x、sqlserver、达梦数据库等数据库,比如业务逻辑中含有redis、es等操作需要控......
  • 设计模式简介及PHP的35种设计模式(上)
    什么是模式??        有经验的00开发者(以及其他的软件开发者)建立了既有通用原则又有惯用方案的指令系统来指导他们编制软件。如果以结构化形式对这些问题、解决方案和命名进行描述使其系统化,那么这些原则和习惯用法就可以称为模式。例如,下面是一个模式样例:    ......
  • 深度学习设计模式之策略模式
    文章目录前言一、介绍二、特点三、详细介绍1.核心组成2.代码示例3.优缺点优点缺点4.使用场景总结前言策略模式定义一系列算法,封装每个算法,并使它们可以互换。一、介绍策略模式(StrategyPattern)是一种行为型设计模式,它定义了一系列算法,并将每一个算法封装起来,使......
  • Python——常用行为模式
    行为模式(BehavioralDesignPatterns)主要解决的是对象之间的职责划分与协作问题。这类模式通过定义对象间的通信方式、责任分配和行为组织,帮助构建可扩展、灵活的系统,并且通过减少耦合和提高复用性来优化系统行为。常见的行为模式有:责任链模式(ChainofResponsibility)命......
  • 深入理解命令模式:设计模式中的行为型模式解析
    深入理解命令模式:设计模式中的行为型模式解析1.引言设计模式是软件开发中一种经过实践验证的、解决常见问题的方案。行为型设计模式关注对象间的职责分配和通信方式。命令模式(CommandPattern)作为一种重要的行为型模式,主要用于将请求封装成对象,从而将请求的发起者和处理......
  • Spring Boot实战:使用模板方法模式优化数据处理流程
    概述在软件开发过程中,我们经常需要处理各种各样的数据,这些数据可能来自不同的源,比如数据库、文件系统或者外部API等。尽管数据来源不同,但很多情况下处理这些数据的步骤是相似的:读取数据、清洗数据、转换数据格式、存储结果等。为了提高代码的复用性和可维护性,我们可以利用设计......
  • 设计模式-责任链模式
    概述责任链模式也是一种行为型的设计模式,它允许按照设定的规则处理事件,顺序执行直到有处理者可以处理这个事件为止,这样的设计模式可以让任务的发出者和任务的处理者没有直接的联系,减少依赖关系,主要由处理者和处理关系组成,以下的例子可以看出。例子:在软件开发中,一般一个任务......
  • 更快更强,SLS 推出高性能 SPL 日志查询模式
    作者:无哲引言随着数字化进程的持续深化,可观测性一直是近年来非常火热的话题,在可观测的三大支柱Log/Trace/Metric中,日志(Log)数据一般是最为常见的,企业迈向可观测性的第一步,也往往始于日志数据的采集上云。日志完成收集后,最直接的需求就是从海量日志数据中检索分析出有价值的信息......