行为型模式-责任链模式

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

核心思想

请求的发送者不需要指定具体的接收者。

请求沿着链条传递,每个处理者根据自身的逻辑决定是否处理请求。

如果某个处理者无法处理,则传递给下一个处理者。

结构

责任链模式通常包含以下角色:

  • Handler(处理者接口/抽象类):

  • 定义处理请求的方法 handleRequest。

    持有对下一个处理者的引用。

  • ConcreteHandler(具体处理者):

    实现具体的请求处理逻辑。

    判断是否处理请求,如果不处理则将请求传递给下一个处理者。

  • Client(客户端):

    创建链条,并发送请求。

优缺点

  • 优点
    降低耦合度: 请求的发送者和处理者解耦。
    灵活性: 可以通过调整链条顺序、动态添加/移除处理者来改变责任的分配。
    扩展性好: 增加新的处理者不会影响现有代码。
  • 缺点
    链条过长: 如果链条过长,处理可能会影响性能。
    调试困难: 链条中的问题可能难以排查。

实现示例

java 复制代码
// 抽象处理者
abstract class Handler {
    protected Handler next; // 下一个处理者

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

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

// 具体处理者A
class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request < 10) {
            System.out.println("HandlerA 处理请求:" + request);
        } else if (next != null) {
            next.handleRequest(request); // 转发请求
        }
    }
}

// 具体处理者B
class ConcreteHandlerB extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println("HandlerB 处理请求:" + request);
        } else if (next != null) {
            next.handleRequest(request); // 转发请求
        }
    }
}

// 具体处理者C
class ConcreteHandlerC extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 20) {
            System.out.println("HandlerC 处理请求:" + request);
        } else if (next != null) {
            next.handleRequest(request); // 转发请求
        }
    }
}

// 客户端
public class ChainOfResponsibilityDemo {
    public static void main(String[] args) {
        // 创建处理者
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        // 构建链条 A -> B -> C
        handlerA.setNext(handlerB);
        handlerB.setNext(handlerC);

        // 测试请求
        int[] requests = {5, 14, 22, 8};
        for (int request : requests) {
            handlerA.handleRequest(request);
        }
    }
}

适用场景

  • 多个对象可以处理同一请求: 请求的处理者动态决定。
  • 需要动态指定处理顺序: 处理者之间可以灵活地增删改。
  • 避免强耦合: 客户端和具体处理者解耦。

这种模式非常适合用于审批流程、日志处理、职责划分等场景。

相关推荐
计算机小混子3 天前
C++实现设计模式---职责链模式 (Chain of Responsibility)
c++·设计模式·责任链模式
博一波3 天前
【设计模式-行为型】职责链模式
设计模式·责任链模式
晚秋贰拾伍4 天前
设计模式的艺术-职责链模式
运维·设计模式·运维开发·责任链模式·开闭原则·单一职责原则
zhulangfly4 天前
【Java设计模式-7】责任链模式:我是流水线的一员
java·设计模式·责任链模式
Hello Dam5 天前
接口 V2 完善:基于责任链模式、Canal 监听 Binlog 实现数据库、缓存的库存最终一致性
数据库·缓存·canal·binlog·责任链模式·数据一致性
新与5 天前
设计模式:责任链模式——行为型模式
设计模式·责任链模式
拾荒的小海螺6 天前
JAVA:Spring Boot 实现责任链模式处理订单流程的技术指南
java·spring boot·责任链模式
workflower13 天前
CHAIN OF RESPONSIBILITY(职责链)—对象行为型模式
需求分析·责任链模式·uml·原型模式·软件需求·统一建模语言
ThetaarSofVenice13 天前
一个个顺序挨着来 - 责任链模式(Chain of Responsibility Pattern)
java·设计模式·责任链模式
sjsjsbbsbsn14 天前
学习记录-责任链模式验证参数
java·学习·责任链模式