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

设计模式系列文章目录

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

【设计模式相关书籍】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组成,根据“链”传递顺序依次处理

责任链类图

责任链优缺点

优点

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

缺点

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

责任链应用场景

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

责任链代码实现

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

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

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

定义抽象方法 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从零学架构】,后台回复【设计模式】自取

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 52
    评论
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

janyxe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值