16、行为型模式-责任链设计模式

2021-07-22  本文已影响0人  日落_3d9f

责任链设计模式(Chain of Responsibility Pattern)

应用场景

角色

责任链设计模式

业务需求

风控规则,就是对于每个场景,定义一些规则,来进行相应的控制,比如银行借款、支付宝提现、大额转账等 会触发不同的策略。

像互联网金融行业的话,除了公司内部政策,所处的外部环境经常发生变化,比如国家经常会出政策,这些都经常需要调整相应的风控参数和风控级别。

例子:支付宝转账,根据转账额度不同,会触发的风控级别不一样,1000元以下直接转,1千到1万需要手机号验证码,1万到以上需要刷脸验证。

责任链设计模式

代码:
请求类:

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;
    }
}

请求类型:

public enum RequestType {
    /**
     * 转账
     */
    TRANSFER,
    /**
     * 提现
     */
    CASH_OUT;
}

抽象风控类:

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:

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);
            }
        }
    }
}

风控具体类2:

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);
            }
        }
    }
}

风控具体类3:

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);
            }
        }
    }
}

Main方法:

public class Main {
    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(20000);
        firstControlManager.handlerRequest(request1);
    }
}

执行结果:

大额操作,输入支付密码+验证码+人脸识别 
高级风控:CASH_OUT, 金额:20000 处理完成

优点

缺点

日志处理级别

上一篇下一篇

猜你喜欢

热点阅读