首页 > 编程语言 >16.(行为型模式)java设计模式之责任链模式

16.(行为型模式)java设计模式之责任链模式

时间:2023-03-16 20:34:54浏览次数:42  
标签:RiskControlManager java 请求 处理 request 模式 设计模式 public name

一、什么是责任链模式模式(Chain of Responsibility)

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

业务需求场景: 风控规则,根据每个场景,定义一些规则。 使用中的案例

二、责任链模式的实现方式

模式结构分析:

  • Handler抽象处理者:定义了一个处理请求的接口。获取它的后续节点。
  • ConcreteHandler具体处理者:处理所负责的请求,可访问它的后续节点,如果可处理该请求就处理,否则就将该请求转发给它的后续节点。

类关系图:

统一模型:

代码实现:

查看代码
@Data
public class ChainRequest {
    //类别
    String requestType;
    //⾦额
    int money;
}
public enum RequestTypeEnum {
    /**
     * 转账
     */
    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(ChainRequest request);
}
public class FirstRiskControlManager extends RiskControlManager {

    public FirstRiskControlManager(String name) {
        super(name);
    }

    @Override
    public void handlerRequest(ChainRequest request) {
        if (RequestTypeEnum.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);
            }
        }
    }
}
public class SecondRiskControlManager extends RiskControlManager {

    public SecondRiskControlManager(String name) {
        super(name);
    }

    @Override
    public void handlerRequest(ChainRequest request) {
        if (RequestTypeEnum.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);
            }
        }
    }
}
public class ThirdRiskControlManager extends RiskControlManager {

    public ThirdRiskControlManager(String name) {
        super(name);
    }

    @Override
    public void handlerRequest(ChainRequest request) {
        if (RequestTypeEnum.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);
            }
        }
    }
}
/*
* 风险责任链
* */
public class RiskChainContext {

    public RiskControlManager getRiskContext(){
        RiskControlManager firstControlManager = new FirstRiskControlManager("初级⻛控");
        RiskControlManager secondControlManager = new SecondRiskControlManager("中级⻛控");
        RiskControlManager thirdControlManager = new ThirdRiskControlManager("⾼级⻛控");

        //形成调⽤链
        firstControlManager.setSuperior(secondControlManager);
        secondControlManager.setSuperior(thirdControlManager);
        return firstControlManager;
    }
}

测试用例:

/*
* 责任链模式
* */
@Test
public void getChainOfResponsibility(){
    RiskChainContext riskChainContext=new RiskChainContext();
    RiskControlManager firstControlManager =riskChainContext.getRiskContext();
    //使⽤
    ChainRequest request1 = new ChainRequest();
    request1.setRequestType(RequestTypeEnum.CASH_OUT.name());
    request1.setMoney(20000);
    firstControlManager.handlerRequest(request1);
}

测试结果:

⼤额操作,输⼊⽀付 密码+验证码+⼈脸识别
⾼级⻛控:CASH_OUT, ⾦额:20000 处理完成

方法评估:

优点:

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

缺点:

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

三、JAVA知识点

四.汇总

标签:RiskControlManager,java,请求,处理,request,模式,设计模式,public,name
From: https://www.cnblogs.com/q994321263/p/17053573.html

相关文章

  • java的多态
    概念、同一个事物,在不同的情况下,表现出来的状态不一样语法父类申明指向子类对象注意父类和子类之间必须存在着继承关系,不一定是直接的继承关系,父类可以是爸爸,也可以......
  • java中的继承
    概念程序中的继承要满足一个前提:isa父类是具有共性的,子类是具有特性的java是单根继承(即一个子类,只能有一个直接父类)好处在子类中在可以获取弗雷哪里可以继承的的方......
  • Java中的NIO
    最近在研究Java中的IO,感觉这一块很重要,只要涉及到数据传输,不论是本地文件传输,还是远程的网络传输,基本离不开IO。上一篇文章已经大致的总结了一下Java1.1的传统IO(Java中的I......
  • vue-router的两种模式
    hash和history区别:外观上:hash的路由在url中带有#号功能上:hash虽然在url中,但是请求不会包裹它,对后端不会产生任何影响,改变hash不会重新加载页面。history是利用了htm......
  • javascript addEventListener
    addEventListenerEventTarget.addEventListener()方法将指定的监听器注册到EventTarget上,当该对象触发指定的事件时,指定的回调函数就会被执行。1.1EventTarget可以......
  • JavaScript基础
    JS是什么是运行在浏览器的编程语言,由ECMAscript(基础语法)+DOM+BOM组成。导入方式导入方式有三种,内部导入、外部导入、行内导入注意:script便签加在/body前为妙......
  • JAVA WEB超大文件上传解决方案:分片断点上传(一)
    ​ 上周遇到这样一个问题,客户上传高清视频(1G以上)的时候上传失败。一开始以为是session过期或者文件大小受系统限制,导致的错误。查看了系统的配置文件没有看到文件大小......
  • 【设计模式】模板方法
    1.模板方法(TemplateMethod)的定义模板方法模式是一种行为设计模式,它在超类中定义一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。模板是对多种事物的结......
  • 设计模式之装饰者模式,奶茶店场景
    //Seehttps://aka.ms/new-console-templateformoreinformationusingSystem.Drawing;/*装饰者模式,不改变实现类的情况下,动态给实现类增加新功能,这里使用聚合......
  • JavaScript 实现异步任务循环顺序执行
    JavaScript实现异步任务循环顺序执行需求场景:数组的元素作为异步任务的参数,循环遍历该数组,并执行异步任务。一、错误的实现//异步任务的参数数组constarr=[1,2,......