Java学设计模式之责任链模式

一、责任链模式概念

1.1 什么是责任链模式

责任链模式是一种行为型设计模式,它允许多个对象在处理请求时依次处理,直到其中一个对象能够处理该请求为止。这些对象被连接成一条链,请求沿着链传递,直到被处理为止。责任链模式将请求发送者和接收者解耦,使得多个对象都有机会处理请求,同时避免了请求的发送者需要知道具体哪个对象会处理请求的情况。

结构

责任链模式一般包含以下几个要素:

  1. Handler(处理者): 定义了处理请求的接口,并且通常包含一个指向下一个处理者的引用。处理者接收到请求后,可以选择进行处理,或者将请求传递给下一个处理者。

  2. ConcreteHandler(具体处理者): 实现了处理请求的具体逻辑。如果能够处理请求,就进行处理;否则将请求传递给下一个处理者。

  3. Client(客户端): 创建并且发送请求给处理者对象。

二、责任链模式代码

2.1 处理者

public abstract class Approver {
    protected Approver nextApprover;
    protected double approvalLimit;

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

    abstract void processRequest(double amount);
}

2.2 具体处理者

public class Manager extends Approver {
    Manager(double approvalLimit) {
        this.approvalLimit = approvalLimit;
    }

    @Override
    void processRequest(double amount) {
        if (amount <= approvalLimit) {
            System.out.println("总经理批准的报销:" + amount);
        } else if (nextApprover != null) {
            nextApprover.processRequest(amount);
        } else {
            System.out.println("没有人可以处理的报销:" + amount);
        }
    }
}
public class VicePresident extends Approver{
    VicePresident(double approvalLimit) {
        this.approvalLimit = approvalLimit;
    }

    @Override
    void processRequest(double amount) {
        if (amount <= approvalLimit) {
            System.out.println("副总裁批准的报销:" + amount);
        } else if (nextApprover != null) {
            nextApprover.processRequest(amount);
        } else {
            System.out.println("没有人可以处理的报销:" + amount);
        }
    }
}
public class President extends Approver {
    President(double approvalLimit) {
        this.approvalLimit = approvalLimit;
    }

    @Override
    void processRequest(double amount) {
        if (amount <= approvalLimit) {
            System.out.println("总裁批准的报销:" + amount);
        } else {
            System.out.println("没有人可以处理的报销:" + amount);
        }
    }
}

2.3 测试类

public class ApproverPatternTest {
    public static void main(String[] args) {
        // 创建处理者对象
        Manager manager = new Manager(1000);
        VicePresident vicePresident = new VicePresident(5000);
        President president = new President(10000);

        // 构建责任链
        manager.setNextApprover(vicePresident);
        vicePresident.setNextApprover(president);

        // 发送请求
        manager.processRequest(800);
        manager.processRequest(5000);
        manager.processRequest(15000);

        // 输出:
        // 总经理批准的报销:800.0
        // 副总裁批准的报销:5000.0
        // 没有人可以处理的报销:15000.0
    }
}

三、总结

责任链模式的优点包括:

  • 将请求发送者和接收者解耦,增强了系统的灵活性。
  • 允许动态地增加或修改处理者,无需修改客户端代码。

然而,责任链模式也有一些缺点:

  • 请求可能会在责任链中被多次传递,直到被处理为止,这可能会影响性能。
  • 如果责任链过长或者处理者对象之间存在循环引用,可能会导致系统性能下降或者请求无法被处理。
posted @ 2024-05-10 14:36  启航黑珍珠号  阅读(345)  评论(0编辑  收藏  举报