java设计模式---责任链模式详解

简介: java设计模式---责任链模式详解

一,责任链模式

1,什么是责任链模式

责任链模式:Chain of Responsibility Patten 。就是将链中的每一个结点看做是一个对象,每个结点处理请求均不同,且内部自动维护一个下一个结点对象。当请求从链条的首端出发时,会沿着链的路径依次传递给每一个结点的对象,直到有对象处理这个请求为止。


就是说每个结点会处理一件事情,如果结点间出现异常,那么链路就会中断。


一般比如说一个请假需要多个负责任审批,过五关斩六将等这些,都是责任链模式。


二,框架中使用到的责任链模式

各个框架中用到了责任链模式如下,根据本人所读的框架源码所累积的,如有缺漏,欢迎补充


1,springmvc流程

就拿这个springMvc的执行流程来说,全部流程就组成了一个链条。每一个步骤就是一个结点,每个结点都会有对应的处理方法,每个结点处理完成之后,就会进入下一个结点。一旦某个结点出现异常,那么当前的链路就会停止,当前请求中断。

d4b29793ee964694b9f53623ea087cc6.png


2,mybatis的执行流程

mybatis的执行流程也是通过这个责任链模式,如首先会创建这个SqlSessionFactory,然后通过这个工厂创建一个SqlSession,这个SqlSession只是一个门面模式,会通过Executer执行增删改查的操作,然后一个Handler用于设置参数,一个Handler用于返回结果集,最后通过这个StatementHandler将执行结果获取。里面的整个步骤就相当于形成了一个链条,执行完当前结点就会进入下一个结点,如果出现异常,链条终止往下执行。

b5721118d9e349b8a0ab2fb11a6a4dd4.png


3,spring的过滤器和拦截器

spring里面的这个过滤器链路的调用,以及拦截器的链路调用,也是采用这种责任链模式

e7083faf542246cd963e8194566bfb4d.png


4,sentinel限流熔断

sentinel里面的每一个规则对应一个槽点,如流控规则,授权规则,熔断规则,热点规则,系统规则等。里面也是利用这个责任链模式,每个插槽对应一个规则,每个规则处理一个事件。如果出现异常,那么就会进行对应的限流降级。

d962708e42c84ca9b6ef70c10413f02a.png


5,aop的加载和使用

aop依赖与ioc,在生产bean并进行实例化之前,先通过bean的第一个后置处理器找到所有在类上面加@AspectJ这个注解的所有类,并在这个类的里面找到所有的befeore,after等注解的方法,每一个before,after等都会生成一个对应的advisor,每个advisor包括advise和pointcut,advise主要是用来作为一个增强器的使用,pointcut是为了进行匹配,匹配成功才进行最终的动态代理的生成。最后获取到所有的advisors,由于可能有大量的advisor,因此在bean的最后一个后置处理器才对这些所有的advisor进行处理,即在bean进行初始化之后才进行处理。最后会去循环遍历这些advisors,通过advisors里面封装的pointcut和生成的advisor进行比较,如果匹配成功,则说明bean需要创建动态代理。主要是通过责任链的方式实现。


三,自定义一个责任链模式

结下来举一个案例说明一下这个责任链模式。


1,需求

假设有一个学校有一个采购审批的需要,采购项目需要给领导审批,不同金钱范围,对应的审批领导的等级不同,如下:


1,金额小于5000,由教学主任审批


2,金额小于等于5000,由院长审批


3,金额小于等于30000,由副校长任审批


4,金额大于30000,由校长审批


2,编码

6c4ad9d5ecf44d2e8b85cb059f8cc33d.png


1,接下来进入这个编码环节。首先定义一个实体类ApproverRequest


/**
 * @Author: zhenghuisheng
 * @Date: 2022/9/11 21:19
 */
public class ApproverRequest {
  private int type = 0; //请求类型
  private float price = 0.0f; //请求金额
  private int id = 0;
  //构造器
  public ApproverRequest(int type, float price, int id) {
    this.type = type;
    this.price = price;
    this.id = id;
  }
  public int getType() { return type; }
  public float getPrice() { return price; }
  public int getId() { return id; }
}

2,在写一个抽象类,用于定义全局,作为子类的规范。链条中所有的结点都需要继承子类,实现子类里面的抽象方法

/**
 * @Author: zhenghuisheng
 * @Date: 2022/9/11 21:09
 * 定义全局
 */
public abstract class Approver {
    //下一个调用者
    Approver next ;
    //需要传入的名字
    String name ;
    public Approver(String name){
        this.name = name;
    }
    //设置下一个调用者
    public void setNext(Approver next) {
        this.next = next;
    }
    public abstract void processApprover(ApproveRequest approveRequest);
}

3,然后开始写一个链条中的第一个结点,由教学主任负责审批。如果金额太大,教学主任审批不了,那么就由这个院长审批

/**
 * @Author: zhenghuisheng
 * @Date: 2022/9/11 21:19
 */
public class DepartmentApprover extends Approver {
  public DepartmentApprover(String name) { super(name); }
  @Override
  public void processRequest(ApproveRequest approveRequest) {
    if(approveRequest.getPrice() <= 5000) {
      System.out.println(" 请求编号 id= " + approveRequest.getId() + " 被 " + this.name + " 处理");
    }else {
      approver.processRequest(approveRequest);
    }
  }
}

4,然后开始写一个链条中的第二个结点,由院长负责审批。如果金额太大,院长审批不了,那么就由这个副校长审批

/**
 * @Author: zhenghuisheng
 * @Date: 2022/9/11 21:19
 */
public class CollegeApprover extends Approver {
  public CollegeApprover(String name) {super(name); }
  @Override
  public void processRequest(ApproveRequest approveRequest) {
    if(approveRequest.getPrice() < 5000 && approveRequest.getPrice() <= 10000) {
      System.out.println(" 请求编号 id= " + approveRequest.getId() + " 被 " + this.name + " 处理");
    }else {
      approver.processRequest(purchaseRequest);
    }
  }
}

5,然后开始写一个链条中的第四个结点,由副长负责审批。

/**
 * @Author: zhenghuisheng
 * @Date: 2022/9/11 21:18
 */
public class SchoolMasterApprover extends Approver {
  public SchoolMasterApprover(String name) {super(name); }
  @Override
  public void processRequest(ApproveRequest approveRequest) {
    if(approveRequest.getPrice() > 30000) {
      System.out.println(" 请求编号 id= " + approveRequest.getId() + " 被 " + this.name + " 处理");
    }else {
      approver.processRequest(purchaseRequest);
    }
  }
}

6,最后写一个测试类

/**
 * @Author: zhenghuisheng
 * @Date: 2022/9/11 21:29
 */
public class Test {
  public static void main(String[] args) {
    //创建一个请求
    ApproveRequest approveRequest = new ApproveRequest(1, 31000, 1);
    //创建相关的审批人
    DepartmentApprover departmentApprover = new DepartmentApprover("张主任");
    CollegeApprover collegeApprover = new CollegeApprover("李院长");
    ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("王副校");
    SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("佟校长");
    //需要将各个审批级别的下一个设置好 
    departmentApprover.setApprover(collegeApprover);
    collegeApprover.setApprover(viceSchoolMasterApprover);
    viceSchoolMasterApprover.setApprover(schoolMasterApprover);
    //单向责任链这里可以不加
    schoolMasterApprover.setApprover(departmentApprover);
    departmentApprover.processRequest(approveRequest);
    viceSchoolMasterApprover.processRequest(approveRequest);
  }
}

到这里为止,一个简单的责任链模式就实现好了


相关文章
|
23天前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
54 9
|
23天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
36 0
[Java]23种设计模式
|
7天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
12天前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
31 0
|
1月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
22天前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
本教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速上手Kotlin的读者,推荐查阅“简洁”系列教程。本文通过学生会经费申请的例子,介绍了责任链模式及其在Kotlin中的实现,并使用偏函数进行了改进,使代码更加简洁和灵活。
12 0
|
26天前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
37 0
|
1月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
42 0
|
2月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
2月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)