设计模式——责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它将请求的发送者和接收者解耦,使得多个对象都有机会处理请求,而不是指定特定的接收者。在责任链中,每个对象都是一个处理者,对请求进行判断或处理,并且可以将请求传递给链中的下一个处理者。

原理

  • 抽象处理者(Handler): 定义了一个处理请求的接口,包含了一个方法来处理请求以及一个指向下一个处理者的引用。
  • 具体处理者(Concrete Handler): 是抽象处理者的子类,实现请求处理的方法。如果能够处理该请求,则对其进行处理;否则,通过调用下一个处理者的方法将请求传递下去。
  • 客户端(Client): 创建责任链并提交请求到链上的第一个处理者。

Java代码示例

// 抽象处理者
public abstract class Handler {
    protected Handler nextHandler;

    public void setNext(Handler handler) {
        this.nextHandler = handler;
    }

    // 处理请求的方法
    public abstract void handleRequest(int request);
}

// 具体处理者A
public class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request < 10) {
            System.out.println("ConcreteHandlerA handled the request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        } else {
            System.out.println("Request not handled");
        }
    }
}

// 具体处理者B
public class ConcreteHandlerB extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println("ConcreteHandlerB handled the request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        } else {
            System.out.println("Request not handled");
        }
    }
}

// 客户端使用示例
public class Client {
    public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();

        // 构建责任链
        handlerA.setNext(handlerB);

        // 提交请求
        handlerA.handleRequest(5);  // ConcreteHandlerA handles it.
        handlerA.handleRequest(15); // ConcreteHandlerB handles it.
        handlerA.handleRequest(25); // No one handles it.
    }
}

想象你正在为一家公司构建一个请假申请审批系统。部门经理、人事主管和CEO都可以审批员工的请假申请。当员工提交申请时,它首先到达部门经理处,如果经理有权批准这个天数的假期则直接处理,否则把申请转交给人事主管,以此类推。在这个例子中,部门经理、人事主管和CEO就形成了一个“责任链”,每个环节都是一个处理者,他们按照一定的顺序处理请求,直到找到合适的审批者为止。

应用

  • 权限系统:不同级别的用户具有不同的权限,请求经过多个角色检查,直到找到有权处理的角色为止。
  • 日志记录器:按级别过滤日志,低级别的处理器不能处理的消息会自动传递给高级别的处理器。
  • 企业审批流程:每一级审批人是一个处理者,根据规则逐级审批或者转交下一级审批。

适用性

  • 请求处理者顺序不确定或动态可变的情况。
  • 一个请求可能由多个对象中的任意一个对象处理,并且希望简化客户端代码,使其不必明确指定处理请求的对象。
  • 需要避免请求发送者与接收者之间的紧耦合,使得系统易于扩展。

你可能感兴趣的:(Java,系列文章,设计模式,责任链模式,java)