• 设计模式-责任链设计模式


    概述

    责任链设计模式是一种解耦请求发送者和接收者的处理机制,属于行为型设计模式。它将多个处理单元链接成一条链,在链中按顺序传递请求直至被处理或达到链尾。该模式广泛应用在日志记录、权限验证、请求过滤等领域。
    允许你将请求沿着处理者链进行发送。收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。

    核心思想

    • 客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象
    • 让多个对象都有机会处理请求,避免请求的发送者和接收者之间的耦合关系,将这个对象连成一条调用链,并沿着这条链传递该请求,直到有一个对象处理它才终止
    • 两个核心行为:一是处理请求,二是将请求传递到下一节点

    场景使用

    • 工作中的审批流程
    • 游戏中的闯关

    责任链模式主要是解耦了请求与处理,客户只需将请求发送到链上即可,无需关心请求的具体内容和处理细节,请求会自动进行传递直至有节点对象进行处理。

    • 在请求处理者不明确的情况下向多个对象中的一个提交请求
    • 如果有多个对象可以处理同一个请求,但是具体由哪个对象处理是由运行时刻动态决定的,这种对象就可以使用职责链模式
    • SpringBoot里面的拦截器、过滤器链

    在这里插入图片描述

    优缺点

    优点

    • 客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递
    • 通过改变链内的调动它们的次序,允许动态地新增或者删除处理类,比较很方便维护
    • 增强了系统的可扩展性,可以根据需要增加新的请求处理类,满足开闭原则
    • 每个类只需要处理自己该处理的工作,明确各类的责任范围,满足单一职责原则

    缺点

    • 处理都分散到了单独的职责对象中,每个对象功能单一,要把整个流程处理完
    • 不能保证请求一定被接收
    • 如果链路比较长,系统性能将受到一定影响,而且在进行代码调试时不太方便

    代码示例

    业务示意图

    在这里插入图片描述

    配置 Request 类

    
    public class Request {
    
        /**
         * 类别
         */
        private String requestType;
    
        /**
         * 金额
         */
        private int money;
    
        public String getRequestType() {
            return requestType;
        }
    
        public void setRequestType(String requestType) {
            this.requestType = requestType;
        }
    
        public int getMoney() {
            return money;
        }
    
        public void setMoney(int money) {
            this.money = money;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    请求类型枚举 RequestType

    public enum RequestType {
    
        /**
         * 转账
         */
        TRANSFER,
    
        /**
         * 提现
         */
        CASH_OUT;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    风控抽象类 RiskControlManager

    
    public abstract class RiskControlManager {
    
    
        protected  String name;
    
        /**
         * 更严格的风控策略
         */
        protected RiskControlManager superior;
    
        public RiskControlManager(String name){
            this.name = name;
        }
    
    
        /**
         * 设置更严格的风控策略
         * @param superior
         */
        public void setSuperior(RiskControlManager superior){
            this.superior = superior;
        }
    
    
        /**
         * 处理请求
         * @param request
         */
        public abstract void handlerRequest(Request request);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    初级风控 FirstRiskControlManager

    
    public class FirstRiskControlManager extends RiskControlManager {
    
        public FirstRiskControlManager(String name) {
            super(name);
        }
    
        /**
         *  1000元以内可以直接处理
         * @param request
         */
        @Override
        public void handlerRequest(Request request) {
    
            if(RequestType.valueOf(request.getRequestType())!=null && request.getMoney()<=1000){
    
                System.out.println("普通操作,输入支付密码即可");
    
                System.out.println(name+":"+request.getRequestType() + ", 金额:"+request.getMoney() +" 处理完成");
    
            }else {
    
                //下个节点进行处理
                if(superior!=null){
                    superior.handlerRequest(request);
                }
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    中级风控

    
    public class SecondRiskControlManager extends RiskControlManager {
    
        public SecondRiskControlManager(String name) {
            super(name);
        }
    
        /**
         * 处理 1千到1万之间
         * @param request
         */
        @Override
        public void handlerRequest(Request request) {
            if(RequestType.valueOf(request.getRequestType())!=null && request.getMoney()>1000 && request.getMoney()<10000){
    
                System.out.println("稍大额操作,输入支付密码+短信验证码即可");
    
                System.out.println(name+":"+request.getRequestType() + ", 金额:"+request.getMoney() +" 处理完成");
    
            }else {
    
                //下个节点进行处理
                if(superior!=null){
                    superior.handlerRequest(request);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    高级风控 ThirdRiskControlManager

    
    public class ThirdRiskControlManager extends RiskControlManager {
    
        public ThirdRiskControlManager(String name) {
            super(name);
        }
    
        @Override
        public void handlerRequest(Request request) {
            if(RequestType.valueOf(request.getRequestType())!=null && request.getMoney()>10000){
    
                System.out.println("大额操作,输入支付密码+验证码+人脸识别 ");
    
                System.out.println(name+":"+request.getRequestType() + ", 金额:"+request.getMoney() +" 处理完成");
    
            }else {
                //下个节点进行处理
                if(superior!=null){
                    superior.handlerRequest(request);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    测试

    public static void main(String[] args) {
            RiskControlManager firstControlManager = new FirstRiskControlManager("初级风控");
    
            RiskControlManager secondControlManager = new SecondRiskControlManager("中级风控");
    
            RiskControlManager thirdControlManager = new ThirdRiskControlManager("高级风控");
    
            //形成调用链
            firstControlManager.setSuperior(secondControlManager);
            secondControlManager.setSuperior(thirdControlManager);
            //使用
            Request request1 = new Request();
            request1.setRequestType(RequestType.CASH_OUT.name());
            request1.setMoney(21000);
            firstControlManager.handlerRequest(request1);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    理财和银保区别
    echarts封装 - 1
    .NET Core学习笔记
    Python函数(一)※
    LeetCode刷题笔记-749. 隔离病毒-模拟+搜索
    Spark运行spark-shell与hive运行时均报错的一种解决方案
    Java Maven Tomcat使用Tesseract-OCR文字识别(Tess4j)
    Swift -- 数组高阶函数
    汽车行业数字化转型:时代巨变下的新机遇
    g++安装 yum -y install gcc+ gcc-c++ 报错Unable to find a match: gcc+
  • 原文地址:https://blog.csdn.net/laow1314/article/details/133979237