1、基本介绍

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。 意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。 何时使用:在处理消息的时候以过滤很多道。 如何解决:拦截的类都实现统一接口。 关键代码:Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。 应用实例: 1、员工请假,小于等于2天组长审批。大于2天小于等于10天项目经理审批。大于10天直接辞退(狗头)。

2、具体实现

  • 定义抽象处理者

    1. public abstract class Handler {
    2. // 组长可审批天数
    3. public static int groupTeamApproveDays = 2;
    4. // 项目经理可审批天数
    5. public static int projectManagerApproveDays = 10;
    6. // 该审批人可审批的天数级别
    7. public int approveLevel;
    8. // 下一级别审批人
    9. private Handler nextHandler;
    10. public Handler getNextHandler() {
    11. return nextHandler;
    12. }
    13. public void setNextHandler(Handler nextHandler) {
    14. this.nextHandler = nextHandler;
    15. }
    16. // 处理请假审批的方法
    17. public void handleRequest(int requestDays) {
    18. // 实际请假天数,超出了该层级权限范围,提交下一级审批
    19. if (requestDays > this.approveLevel) {
    20. if (nextHandler != null) {
    21. nextHandler.handleRequest(requestDays);
    22. }
    23. if (nextHandler == null) {
    24. System.out.println("你还是走吧");
    25. }
    26. } else {
    27. approveComment();
    28. }
    29. }
    30. // 审批意见
    31. public abstract void approveComment();
    32. }
  • 定义具体处理者

    1. public class GroupTeam extends Handler {
    2. public GroupTeam(int approveLevel) {
    3. this.approveLevel = approveLevel;
    4. }
    5. @Override
    6. public void approveComment() {
    7. System.out.println("本组长同意请假");
    8. }
    9. }
    10. public class ProjectManager extends Handler {
    11. public ProjectManager(int approveLevel) {
    12. this.approveLevel = approveLevel;
    13. }
    14. @Override
    15. public void approveComment() {
    16. System.out.println("本项目经理同意请假");
    17. }
    18. }
  • 运行

    1. public class Demo {
    2. public static void main(String[] args) {
    3. // 组装责任链
    4. Handler groupTeam = new GroupTeam(Handler.groupTeamApproveDays);
    5. Handler projectManager = new ProjectManager(Handler.projectManagerApproveDays);
    6. groupTeam.setNextHandler(projectManager);
    7. // 请假
    8. groupTeam.handleRequest(1);
    9. groupTeam.handleRequest(8);
    10. groupTeam.handleRequest(12);
    11. }
    12. }

    image.png