18、责任链模式(Chain of Responsibility Pattern)

责任链模式,是用于避免请求发送者与多个请求处理者耦合在一起,让所有请求的处理者持有下一个对象的引用,从而将请求串联成一条链,在有请求发生时,可将请求沿着这条链传递,直到遇到该对象的处理器。用户只需将请求发送到责任链上即可,无须关心请求的处理细节和传递过程。

责任链模式包含以下三种角色。

  • Handler 接口:用于规定在责任链上具体要执行的方法。
  • AbstractHandler 抽象类:持有Handler实例并通过setHandler()和getHandler()将各个具体的业务Handler串联成一个责任链,客户端上的请求在责任链上执行。
  • Handler 业务处理类:用户根据具体的业务需求实现的业务逻辑。

服务端要针对客户端的请求实现用户鉴权、业务调用、结果反馈流程 UML设计图如下:

1)Handler 接口:

java 复制代码
public interface Handler {
    void operator();
}

2)AbstractHandler 抽象类:

java 复制代码
public abstract class AbstractHandler {
    private Handler handler;

    public Handler getHandler() {
        return handler;
    }

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

3)Handler 业务处理类:

java 复制代码
@Slf4j
public class AuthHandler extends AbstractHandler implements Handler {
    private String name;

    public AuthHandler(String name) {
        this.name = name;
    }

    @Override
    public void operator() {
        log.info("user auth ...");
        if (getHandler() != null) {
            getHandler().operator();
        }
    }
}
java 复制代码
@Slf4j
public class BusinessHandler extends AbstractHandler implements Handler {

    private String name;

    public BusinessHandler(String name) {
        this.name = name;
    }

    @Override
    public void operator() {
        log.info("business handler ...");
        if (getHandler() != null) {
            getHandler().operator();
        }
    }
}
java 复制代码
@Slf4j
public class ResponseHandler extends AbstractHandler implements Handler {

    private String name;

    public ResponseHandler(String name) {
        this.name = name;
    }

    @Override
    public void operator() {
        log.info("response handler ...");
        if (getHandler() != null) {
            getHandler().operator();
        }
    }
}

4)责任链模式测试类:

java 复制代码
public class ResponsibilityChainDemoTest {

    public static void main(String[] args) {
        AuthHandler authHandler = new AuthHandler("auth");
        BusinessHandler businessHandler = new BusinessHandler("buss");
        ResponseHandler responseHandler = new ResponseHandler("resp");
        authHandler.setHandler(businessHandler);
        businessHandler.setHandler(responseHandler);
        authHandler.operator();
    }
}

5)打印结果:

相关推荐
看山是山_Lau1 小时前
建造者模式:复杂对象如何一步步构建
设计模式·建造者模式
霸道流氓气质2 小时前
业务链路追踪日志设计模式 — 从原理到实践
设计模式
nnsix1 天前
设计模式 - 建造者模式 笔记
笔记·设计模式·建造者模式
cui17875681 天前
矩阵拼团 + 复购拼团:新零售最稳的复购模式,规则简单
大数据·人工智能·设计模式·零售
百珏1 天前
[灰度发布]:全链路透传组件:APM、自研方案与 Java Agent 的实现取舍
后端·设计模式·架构
likerhood1 天前
设计模式 · 享元模式(Flyweight Pattern)java
java·设计模式·享元模式
AI大法师1 天前
从 Adobe 焕新看品牌系统升级:Logo、主色、字体与产品体验如何重新对齐
大数据·人工智能·adobe·设计模式
贵慜_Derek1 天前
《从零实现 Agent 系统》连载 03|控制循环:感知—决策—行动—反思
人工智能·设计模式·架构
nnsix1 天前
设计模式 - 原型模式 笔记
笔记·设计模式·原型模式
nnsix1 天前
设计模式 - 适配器模式 笔记
笔记·设计模式·适配器模式