Java责任链模式(Chain of responsibility)

简介: 在处理流程相关的业务的时候我们会经常碰到责任链模式的使用,所以对于这种设计模式我们还是应该有所了解的,所以本文就来记录下。


 在处理流程相关的业务的时候我们会经常碰到责任链模式的使用,所以对于这种设计模式我们还是应该有所了解的,所以本文就来记录下。

责任链模式

定义

 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象处理。

场景:

   公司里面,报销个单据需要经过流程:

   • 申请人填单申请,申请给经理

   • 小于1000,经理审查。

   • 超过1000,交给总经理审批。

   • 总经理审批通过

   公司里面,请假条的审批过程:

   • 如果请假天数小于3天,主任审批

   • 如果请假天数大于等于3天,小于10天,经理审批

   • 如果大于等于10天,小于30天,总经理审批

   • 如果大于等于30天,提示拒绝

image.png

请假流程类图

image.png

具体实现代码

LeaveRequest

 封装请假的相关信息

/**
 * 封装请假的基本信息
 * @author 波波烤鸭
 *
 */
public class LeaveRequest {
  // 员工名称
  private String empName;
  // 请假天数
  private int leaveDays;
  // 请假原因
  private String reason;
  public LeaveRequest(String empName, int leaveDays, String reason) {
    super();
    this.empName = empName;
    this.leaveDays = leaveDays;
    this.reason = reason;
  }
  public String getEmpName() {
    return empName;
  }
  public void setEmpName(String empName) {
    this.empName = empName;
  }
  public int getLeaveDays() {
    return leaveDays;
  }
  public void setLeaveDays(int leaveDays) {
    this.leaveDays = leaveDays;
  }
  public String getReason() {
    return reason;
  }
  public void setReason(String reason) {
    this.reason = reason;
  } 
}

Leader

 领导的抽象类

/**
 * 抽象类
 * @author 波波烤鸭
 *
 */
public abstract class Leader {
  // 领导姓名
  protected String name;
  // 下一个处理的领导
  protected Leader nextLeader; //责任链上的后继对象
  public Leader(String name) {
    super();
    this.name = name;
  }
  //设定责任链上的后继对象
  public void setNextLeader(Leader nextLeader) {
    this.nextLeader = nextLeader;
  }
  /**
   * 处理请求的核心的业务方法
   * @param request
   */
  public abstract void handleRequest(LeaveRequest request);
}

Director

 主任的实现类

/**
 * 主任
 * @author 波波烤鸭
 *
 */
public class Director extends Leader {
  public Director(String name) {
    super(name);
  }
  @Override
  public void handleRequest(LeaveRequest request) {
    if(request.getLeaveDays()<3){
      System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
      System.out.println("主任:"+this.name+",审批通过!");
    }else{
      if(this.nextLeader!=null){
        this.nextLeader.handleRequest(request);
      }
    }
  }
}

Manager

 经理的实现类

/**
 * 经理
 * @author 波波烤鸭
 *
 */
public class Manager extends Leader {
  public Manager(String name) {
    super(name);
  }
  @Override
  public void handleRequest(LeaveRequest request) {
    if(request.getLeaveDays()<10){
      System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
      System.out.println("经理:"+this.name+",审批通过!");
    }else{
      if(this.nextLeader!=null){
        this.nextLeader.handleRequest(request);
      }
    }
  }
}

ViceGeneralManager

 副总经理的实现类

/**
 * 副总经理
 * @author 波波烤鸭
 *
 */
public class ViceGeneralManager extends Leader {
  public ViceGeneralManager(String name) {
    super(name);
  }
  @Override
  public void handleRequest(LeaveRequest request) {
    if(request.getLeaveDays()<20){
      System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
      System.out.println("副总经理:"+this.name+",审批通过!");
    }else{
      if(this.nextLeader!=null){
        this.nextLeader.handleRequest(request);
      }
    }
  }
}

GeneralManager

 总经理的实现类

/**
 * 总经理
 * @author 波波烤鸭
 *
 */
public class GeneralManager extends Leader {
  public GeneralManager(String name) {
    super(name);
  }
  @Override
  public void handleRequest(LeaveRequest request) {
    if(request.getLeaveDays()<30){
      System.out.println("员工:"+request.getEmpName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
      System.out.println("总经理:"+this.name+",审批通过!");
    }else{
      System.out.println("莫非"+request.getEmpName()+"想辞职,居然请假"+request.getLeaveDays()+"天!");
    }
  }
}

client

 客户端调用测试

public static void main(String[] args) {
  Leader a = new Director("张三");
  Leader b = new Manager("李四");
  Leader b2 = new ViceGeneralManager("王五");
  Leader c = new GeneralManager("波波烤鸭");
  //组织责任链对象的关系
  a.setNextLeader(b);
  b.setNextLeader(b2);
  b2.setNextLeader(c);
  //开始请假操作
  LeaveRequest req1 = new LeaveRequest("TOM", 15, "老婆生孩子回家探望!");
  a.handleRequest(req1);
}

输出结果:

员工:TOM请假,天数:15,理由:老婆生孩子回家探望!
副总经理:王五,审批通过!

添加新的处理对象:

 由于责任链的创建完全在客户端,因此新增新的具体处理者对原有类库没有任何影响,只需添加新的类,然后在客户端调用时添加即可。符合开闭原则。

image.png

开发中常见的场景:

   Java中,异常机制就是一种责任链模式。一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch.

   Javascript语言中,事件的冒泡和捕获机制。Java语言中,事件的处理采用观察者模式。

   Servlet开发中,过滤器的链式处理

   Struts2中,拦截器的调用也是典型的责任链模式


相关文章
|
3月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)
|
7月前
|
设计模式 Java
Java责任链模式
Java责任链模式
57 0
|
6月前
|
设计模式 Java 中间件
深入探索Java设计模式:责任链模式解析与实践
深入探索Java设计模式:责任链模式解析与实践
61 0
|
6月前
|
设计模式 Java
Java设计模式之责任链模式详解
Java设计模式之责任链模式详解
|
7月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Chain of responsibility(责任链模式)
【设计模式】JAVA Design Patterns——Chain of responsibility(责任链模式)
|
7月前
|
设计模式 Java
23种设计模式,责任链模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】责任链模式是一种行为设计模式,它允许将请求沿着处理者链进行传递,直到有对象处理该请求为止。这种模式提供了一种解耦请求的发送者和接收者之间的方式,通过给多个对象处理一个请求的机会,减少了对象间的耦合度。
54 1
|
7月前
|
设计模式 Java
Java责任链模式
Java责任链模式
53 0
|
7月前
|
设计模式 Java
Java设计模式【十四】:责任链模式
Java设计模式【十四】:责任链模式
55 0
|
设计模式 Java 应用服务中间件
【设计模式——学习笔记】23种设计模式——职责链/责任链模式(Chain of Responsibility)(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——职责链/责任链模式(Chain of Responsibility)(原理讲解+应用场景介绍+案例介绍+Java代码实现)
153 0
|
2天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。