面试必问设计模式之责任链模式

设计模式系列文章目录

  • 面试必问设计模式之基础篇
  • 面试必问设计模式之工厂方法模式(超详细)
  • 面试必问设计模式之单例模式(超详细)
  • 面试必问设计模式之责任链模式

如果本文对你们的开发之路有所帮助,请帮忙点个赞,您的支持是我坚持写博客的动力

【设计模式相关书籍】wx关注【Java从零学架构】,后台回复【设计模式】自取

前言

上一篇文章带着大家输入学习了设计模式的工厂模式,这篇文章带着大家深入责任链模式

项目代码见 https://gitee.com/janyxe/design_patterns

责任链定义

Avoid coupling the sender of a request to its receiver by giving more
than one object a chance to handle the request.Chain the receiving objects
and pass the request along the chain until an object handles it.

使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关
系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处
理它为止。

能画出责任链模式类图吗?并简单说明下

简言之:责任链模式的核心在“链”上,“链”是由多个处理者ConcreteHandler组成,根据“链”传递顺序依次处理

责任链类图

面试必问设计模式之责任链模式_第1张图片

责任链优缺点

优点

  • 请求者与接受者解耦。每个职责对象只负责对应的职责范围,各组件完全解耦。

缺点

  • 系统粒度变小,功能集中到了单独的职责对象,每个对象功能单一,整个流程处理完成会有很多细粒度职责对象
  • 性能可能也有问题,链长的时候环节变多,系统性能就会变差,系统逻辑变复杂

责任链应用场景

  • 权限系统的多条件流程判断
  • 流程审批系统实现多层级审批
  • Sentinel 底层限流实现(后续Sentinel 源码解析会讲解)
  • Java 过滤器底层实现

责任链代码实现

实现代码背景:网关作为作为程序入口,拦截请求实现权限控制以及登录日志记录的功能

“链”:Token校验 -> 权限校验 -> 日志处理

项目代码见 https://gitee.com/janyxe/design_patterns

面试必问设计模式之责任链模式_第2张图片

定义抽象方法 com.jany.chain.GatewayHandler

public abstract  class GatewayHandler {

    private GatewayHandler gatewayHandler;

    /**
     * 过滤
     */
    public abstract void doFilter();

    public GatewayHandler(GatewayHandler gatewayHandler) {
        this.gatewayHandler = gatewayHandler;
    }


    protected void nextHandler() {
        if (gatewayHandler != null) {
            gatewayHandler.doFilter();
        }
    }
}

Token 校验逻辑 com.jany.chain.TokenHandler

/**
 * Token 校验
 */
public class TokenHandler extends GatewayHandler{

    public TokenHandler(GatewayHandler gatewayHandler) {
        super(gatewayHandler);
    }

    public void doFilter() {
        System.out.println("处理Token验证逻辑");
        nextHandler();
    }
}

权限校验 com.jany.chain.PermissionHandler

public class PermissionHandler extends GatewayHandler{

    public PermissionHandler(GatewayHandler gatewayHandler) {
        super(gatewayHandler);
    }

    public void doFilter() {
        System.out.println("处理权限逻辑");
        nextHandler();
    }
}

日志处理 com.jany.chain.LoggerHandler

/**
 * 日志处理
 */
public class LoggerHandler extends GatewayHandler{

    public LoggerHandler(GatewayHandler gatewayHandler) {
        super(gatewayHandler);
    }

    public void doFilter() {
        System.out.println("处理日志逻辑");
    }
}

责任链实现 com.jany.chain.ChainApp

/**
 * 责任链实现
 */
public class ChainApp {

    /**
     * 获取GatewayHandler
     * @return
     */
    public static GatewayHandler getGatewayHandler(){
        return new TokenHandler(new PermissionHandler(new LoggerHandler(null)));
    }

    public static void main(String[] args) {
        GatewayHandler gatewayHandler = getGatewayHandler();
        gatewayHandler.doFilter();
    }
}

运行程序,控制台输出

处理Token验证逻辑
处理权限逻辑
处理日志逻辑

如果本文对你们的开发之路有所帮助,请帮忙点个赞,您的支持是我坚持写博客的动力

【设计模式相关书籍】wx关注【Java从零学架构】,后台回复【设计模式】自取

你可能感兴趣的:(设计模式,面试,设计模式,责任链模式)