菜鸟程序员都能看懂的“职责链模式”

265 阅读3分钟

最近河北一直在报道新冠疫情的相关信息,大家一定要注意防护,戴口罩,少聚集,勤洗手。相信河北、相信中国,我们一定会挺过去的。

概述

职责链模式也被称为责任链模式,是行为型设计模式的一种。

职责链模式的核心思想是:将请求的发送者和接收者进行解耦,通过创建一个接收者对象的“链”(就是将多个接收者连接起来)来处理请求。

在职责链模式中通常每个接收者都包含另一个接收者的引用,这样在处理请求时,如果自己无法处理该请求时就会把请求,传递给下一个接收者,依次类推直到最后。

职责链模式UML类图

类图讲解

Handler:抽象处理者角色;定义了处理请求的相关接口,并聚合了一个Handler对象。  
ConcreteHandlerA/B:具体处理者角色;继承了Handler并实现了处理请求的相关接口;主要的作用是处理自己负责的请求,如果请求不属于自己时,负责将请求传递给下一个处理者。  
Request:表示请求角色。  
Client:客户端测试类。

演示案例

案例:通过职责链模式来实现根据请假天数的不同需要不同领导进行审批的功能。

审核请求 => 对应请求角色

public class VerifyRequest {

  // 请假天数
  private int days;

  // 请求者姓名
  private String requestorName;

  // ...get()和set();
}

抽象处理者

public abstract class Approver {

  // 下一个处理者
  protected Approver approver;

  // 审核(处理请求的方法)
  public abstract void verify(VerifyRequest request);

  public void setApprover(Approver approver) {
    this.approver = approver;
  }
}

具体处理者

// 团队组长
public class GroupLeader extends Approver {

  @Override
  public void verify(VerifyRequest request) {
    if (request.getDays() <= 3) {
      System.out.println("团队组长,同意了" + request.getRequestorName()
          + "的" + request.getDays() + "天请假申请。");
    } else {
      // 不属于当前处理者的处理范围,让下一个处理者处理
      approver.verify(request);
    }
  }
}

// 项目经理
public class ProjectManager extends Approver {

  @Override
  public void verify(VerifyRequest request) {
    if (request.getDays() > 3 && request.getDays() <= 10) {
      System.out.println("项目经理,同意了" + request.getRequestorName()
          + "的" + request.getDays() + "天请假申请。");
    } else {
      // 不属于当前处理者的处理范围,让下一个处理者处理
      approver.verify(request);
    }
  }
}

// 老板
public class Boss extends Approver {

  @Override
  public void verify(VerifyRequest request) {
    if (request.getDays() > 10) {
      System.out.println("老板,同意了" + request.getRequestorName()
          + "的" + request.getDays() + "天请假申请。");
    } else {
      // 不属于当前处理者的处理范围,让下一个处理者处理
      approver.verify(request);
    }
  }
}

客户端测试类

public class Client {

  public static void main(String[] args) {
    // 创建请求
    VerifyRequest request = new VerifyRequest();
    request.setDays(10);
    request.setRequestorName("编程小菜鸟");

    // 创建处理者链
    GroupLeader groupLeader = new GroupLeader();
    ProjectManager projectManager = new ProjectManager();
    Boss boss = new Boss();
    groupLeader.setApprover(projectManager);
    projectManager.setApprover(boss);
    boss.setApprover(groupLeader);

    // 进行审核
    groupLeader.verify(request);
  }
}

测试结果

总结

1、职责链模式将请求和处理进行拆分,从而实现了解耦,并且提高了系统的灵活性。

2、客户端只需要将请求发送到职责链上即可,无需关心请求的处理细节和跳转过程。

3、使用职责链模式会影响程序的性能,特别是链比较长的时候,因此需要控制其最大节点数。

4、职责链模式采用了类似递归的方式完成请求的处理,这种方式会增加调试的难度。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞、转发加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。