行为型模式之责任链模式

责任链模式(Chain of Responsibility Pattern)

定义一个抽象处理者(Handler)类,其中包含一个指向下一个处理者的引用。

每个具体处理者(ConcreteHandler)类继承自抽象处理者类,并实现其处理请求的方法。在处理请求时,

如果能够处理,则直接处理;否则将请求传递给下一个处理者。

请求从第一个具体处理者开始,沿着责任链依次传递,直到有某个处理者能够处理或者到达责任链的末端。
优点:

解耦发送者和接收者:发送者不需要知道具体的接收者,只需要将请求发送给责任链的第一个处理者即可。

灵活性和可扩展性:可以动态地增加、删除或修改处理者,而不影响其他处理者的工作。

可以按需处理请求:每个处理者都有机会处理请求,可以根据业务需求决定是否进行处理。
适用场景:

有多个对象可以处理同一请求,但具体处理者在运行时可确定。

需要动态指定处理请求的对象,或者按顺序依次处理请求。

请求的发送者和接收者应该解耦,避免耦合关系过于复杂。

需要注意的是,责任链模式并不保证请求一定会被处理,可能存在请求无法被处理的情况。

在设计时需要合理地安排责任链的顺序和处理逻辑,以确保能够正确地处理请求。

提供demo版代码更容易理解

java 复制代码
/**
 * @author zhou
 *  具体处理者A
 */
class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 0 && request < 10) {
            System.out.println("ConcreteHandlerA 处理请求:" + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

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

/**
 * @author zhou
 *  具体处理者C
 */
class ConcreteHandlerC extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 20 && request < 30) {
            System.out.println("ConcreteHandlerC 处理请求:" + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

/**
 * @author zhou
 *  抽象处理者
 */
abstract class Handler {
    protected Handler nextHandler; // 下一个处理者

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

    public abstract void handleRequest(int request);
}

/**
 * @author zhou
 *  客户端使用
 */
public class ChainOfResponsibilityPattern {
    public static void main(String[] args) {
        // 创建具体处理者对象
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        Handler handlerC = new ConcreteHandlerC();

        // 设置责任链关系
        handlerA.setNextHandler(handlerB);
        handlerB.setNextHandler(handlerC);

        // 发起请求
        int[] requests = {5, 15, 25};
        for (int request : requests) {
            handlerA.handleRequest(request);
        }
    }
}

在这个示例中,我们创建了三个具体处理者(ConcreteHandlerA、ConcreteHandlerB、ConcreteHandlerC),每个处理者都有自己的处理逻辑。

通过设置处理者的nextHandler属性,将它们连接成一个责任链。
当发起请求时,请求会从责任链的第一个处理者(ConcreteHandlerA)开始进行处理。如果当前处理者能够处理该请求,则直接处理;

否则将请求传递给下一个处理者,直到找到能够处理请求的处理者,或者到达责任链的末端。
在上述示例中,请求分别是5、15和25,根据具体处理者的处理范围不同,分别由ConcreteHandlerA、ConcreteHandlerB和ConcreteHandlerC进行处理。

如果请求超过所有处理者的处理范围,将不被任何处理者处理。

相关推荐
LIU_Skill4 天前
SystemV-消息队列与责任链模式
linux·数据结构·c++·责任链模式
Pasregret6 天前
责任链模式:从 Sentinel 流控到审批流程的链式处理
sentinel·责任链模式
骊山道童10 天前
设计模式-责任链模式
设计模式·责任链模式
喵手13 天前
Spring Boot 项目基于责任链模式实现复杂接口的解耦和动态编排!
spring boot·后端·责任链模式
云徒川17 天前
【设计模式】责任链模式
设计模式·责任链模式
自在如风。18 天前
Java 设计模式:责任链模式详解
java·设计模式·责任链模式
coderzpw20 天前
谁该处理我的请假?——责任链模式
设计模式·责任链模式
时雨h20 天前
责任链模式
责任链模式
Niuguangshuo21 天前
Python设计模式:责任链模式
开发语言·python·责任链模式
牵牛老人25 天前
C++设计模式-责任链模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
c++·设计模式·责任链模式