责任链模式

责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这个模式将请求的处理者连接成一条链,沿着这条链传递请求,直到某个处理者处理它为止。

责任链模式的主要角色:

  1. 抽象处理者(Handler): 定义处理请求的接口,通常包含一个处理请求的抽象方法和一个指向下一个处理者的引用(即责任链中的下一个处理者)。
  2. 具体处理者(ConcreteHandler): 继承自抽象处理者,实现具体的处理逻辑。如果它能处理这个请求,它就处理,否则将请求传递给下一个处理者。
  3. 客户端(Client): 创建处理链并将请求传递给责任链的第一个处理者。

责任链模式的核心思想:

请求沿着责任链传递,直到某个处理者处理它或请求到达链的末尾。如果链上的一个对象无法处理请求,它会将请求传递给链中的下一个对象。

优点:

  1. 降低耦合度: 请求的发送者不需要知道是哪一个处理者处理了请求。
  2. 增强灵活性: 可以根据需要动态地添加、修改或删除处理者。
  3. 责任分担: 各个处理者只负责处理自己能处理的部分,其他部分交给后续处理者。

缺点:

  1. 调试困难: 如果链过长,调试时难以追踪请求的处理过程。
  2. 性能开销: 请求从链的头部传递到尾部,可能需要遍历整个链,增加了性能开销。

责任链模式的应用场景:

  1. 权限过滤: 在系统中进行权限检查时,多个处理者可以根据不同的权限级别进行处理。
  2. 事件处理: 在GUI系统中,事件(如点击事件)可能需要在多个处理者之间传递,直到某个处理者处理它。
  3. 日志处理: 系统日志可以根据不同的日志级别传递到不同的处理者。

示例

代码

// 抽象处理者,定义了处理请求的方法和设置下一个处理者的方法
abstract class Approver {
    protected Approver nextApprover; // 下一个处理者

    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }

    public abstract void approveRequest(int amount);
}

// 具体处理者:组长,可以审批额度在1000元以下的请求
public class TeamLeader extends Approver {
    @Override
    public void approveRequest(int amount) {
        if (amount <= 1000) {
            System.out.println("组长批准了" + amount + "元的费用报销请求。");
        } else if (nextApprover != null) {
            System.out.println("组长无法批准" + amount + "元的请求,交由上级处理...");
            nextApprover.approveRequest(amount);
        }
    }
}
// 具体处理者:经理,可以审批额度在5000元以下的请求
public class Manager extends Approver {
    @Override
    public void approveRequest(int amount) {
        if (amount <= 5000) {
            System.out.println("经理批准了" + amount + "元的费用报销请求。");
        } else if (nextApprover != null) {
            System.out.println("经理无法批准" + amount + "元的请求,交由上级处理...");
            nextApprover.approveRequest(amount);
        }
    }
}
// 具体处理者:总监,可以审批额度在10000元以下的请求
public class Director extends Approver {
    @Override
    public void approveRequest(int amount) {
        if (amount <= 10000) {
            System.out.println("总监批准了" + amount + "元的费用报销请求。");
        } else if (nextApprover != null) {
            System.out.println("总监无法批准" + amount + "元的请求,交由上级处理...");
            nextApprover.approveRequest(amount);
        } else {
            System.out.println("请求" + amount + "元的报销费用过高,无法批准。");
        }
    }
}
//客户端
public class TestChainOfResponsibilityPattern {
    public static void main(String[] args) {
        // 创建责任链上的处理者
        Approver teamLeader = new TeamLeader();
        Approver manager = new Manager();
        Approver director = new Director();

        // 设置责任链
        teamLeader.setNextApprover(manager);  // 组长的下一个处理者是经理
        manager.setNextApprover(director);    // 经理的下一个处理者是总监

        // 模拟报销请求
        System.out.println("处理100元的请求:");
        teamLeader.approveRequest(100);

        System.out.println();

        System.out.println("处理3000元的请求:");
        teamLeader.approveRequest(3000);

        System.out.println();

        System.out.println("处理8000元的请求:");
        teamLeader.approveRequest(8000);

        System.out.println();

        System.out.println("处理15000元的请求:");
        teamLeader.approveRequest(15000);
    }
}

解释:

使用责任链模式在处理费用报销请求时的应用。通过设置不同级别的处理者(组长、经理和总监),不同额度的报销请求可以根据责任链传递到合适的审批人。如果当前处理者无法处理请求,则将请求传递给链中的下一个处理者。

posted @ 2024-09-17 15:12  疾风不问归途  阅读(24)  评论(0)    收藏  举报