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)打印结果:

相关推荐
口袋物联16 小时前
设计模式之建造者模式在 C 语言中的应用(含 Linux 内核实例)
c语言·设计模式·建造者模式
phdsky20 小时前
【设计模式】抽象工厂模式
c++·设计模式·抽象工厂模式
7***374521 小时前
Java设计模式之工厂
java·开发语言·设计模式
雨中飘荡的记忆21 小时前
设计模式之原型模式
设计模式
LengineerC1 天前
Rust仿node事件总线的简单实现
设计模式·rust
IT永勇1 天前
C++设计模式-装饰器模式
c++·设计模式·装饰器模式
口袋物联1 天前
设计模式之工厂模式在 C 语言中的应用(含 Linux 内核实例)
linux·c语言·设计模式·简单工厂模式
phdsky1 天前
【设计模式】建造者模式
c++·设计模式·建造者模式
小毛驴8501 天前
软件设计模式-装饰器模式
python·设计模式·装饰器模式
phdsky1 天前
【设计模式】代理模式
设计模式·代理模式