小工具      在线工具  汉语词典  css  js  c++  java

设计模式-责任链模式

设计模式 额外说明

收录于:40天前

背景说明

最近我一直在研究一个用于监控网络心跳的简单逻辑,但我希望它可以变得更通用。设计思路如下:

做一个配置,里面填weburl,还有各种校验模块,
校验模块会有多种,如httpstatus的校验,返回数据的code校验,也可能会有去查数据库的校验,甚至去调另一个接口确认其状态的校验!

流程一开始,有一个定时器,去获取配置,发现配置中包含weburl及其验证模块,然后循环遍历验证模块列表。

同时验证的时候,如果前面的验证不OK的话,后面一般就不需要继续了,所以这个模型有点像责任链,所以我做了一个这样的例子

设计

在这里插入图片描述

其实就是一个抽象类和两个实现类。如果您以后想添加更多处理程序,只需添加它们作为参考即可!

代码参考

抽象处理程序:

为了方便后面处理, 里面有一个方法 genHandlers(String[] validateClassArr)
根据 validateClassArr 来生成 责任链(可以用 反射的方式,不过这里实现少,就直接写出来了

public abstract class AbstractHealthMonitorReqAndJudgeHandler {

    protected AbstractHealthMonitorReqAndJudgeHandler nextHandler ;

    protected void setNextHandler(AbstractHealthMonitorReqAndJudgeHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void doHandle(String procFlag, Object busiObj);


    /**
     * 生成责任链
     * @param validateClassArr
     * @return
     */
    public static AbstractHealthMonitorReqAndJudgeHandler genHandlers(String[] validateClassArr) {
        AbstractHealthMonitorReqAndJudgeHandler theRight = null;
        //构成责任链
        for (int i=validateClassArr.length-1;i>=0;i--) {
            // 由后往前走
            AbstractHealthMonitorReqAndJudgeHandler currentHandler = convertByVClass(validateClassArr[i]);

            //把上一个设置成当前的 下一级
            currentHandler.setNextHandler(theRight);

            // 当前被存起来
            theRight = currentHandler;
        }

        //最后留 下来的为 第一个
        return  theRight;
    }

    private static AbstractHealthMonitorReqAndJudgeHandler convertByVClass(String vClassName) {
        // netJudge,customerization
        AbstractHealthMonitorReqAndJudgeHandler tmp = null;
        if ("netJudge".equals(vClassName)) {
            tmp = new NetJudgeHandler();
        }else if ("customerization".equals(vClassName)) {
            tmp = new CustomizationHandler();
        }else{

        }
        return tmp;
    }

}

public class NetJudgeHandler extends AbstractHealthMonitorReqAndJudgeHandler {

    private static Logger log = LoggerFactory.getLogger(NetJudgeHandler.class);

    @Override
    public void doHandle(String procFlag, Object busiObj) {

        ResponseEntity<String> stringResponseEntity = (ResponseEntity<String>) busiObj;
        if(stringResponseEntity.getStatusCode().equals(HttpStatus.OK)){
            //保存
            log.info("这里进行保存,stringResponseEntity.getStatusCode()为"+stringResponseEntity.getStatusCode());
            //传递
            if (this.nextHandler != null) {
                this.nextHandler.doHandle(procFlag,busiObj);
            }
        }else{
            return;
        }
    }
}
/*
自定义的filter,如判断业务上的状态
*/
public class CustomizationHandler extends AbstractHealthMonitorReqAndJudgeHandler {

    private static Logger log = LoggerFactory.getLogger(CustomizationHandler.class);

    @Override
    public void doHandle(String procFlag, Object busiObj) {

        ResponseEntity<String> stringResponseEntity = (ResponseEntity<String>) busiObj;

        String resultStr = stringResponseEntity.getBody();
        try {
            DPageResponse<WattActivityVO> resultObj = DJsonByJacksonUtils.json2Bean(resultStr, DPageResponse.class);
            Integer total = resultObj.getTotal();
            List itemlist = resultObj.getItemList();
            //保存 TODO
            log.info("这里进行保存,total为"+total);
            if (this.nextHandler != null) {
                this.nextHandler.doHandle(procFlag,busiObj);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用:
这里 的 paramKey_web_handler_class_arr 是一个字符串, 在这里,即: netJudge,customerization
顺序是有要求的

        String[] validateClassArr = paramKey_web_handler_class_arr.split(",");

        //构成责任链
        AbstractHealthMonitorReqAndJudgeHandler firstHandler
                = AbstractHealthMonitorReqAndJudgeHandler.genHandlers(validateClassArr);

        ....//请求逻辑


        firstHandler.doHandle(procFlag,stringResponseEntity);

后记

理想中,是希望能达到 handler更加通用,但感觉处理的时候更多是自定义的逻辑!
加上 责任链 会让条理更加清楚,但通用模块化可能还并不明朗,先用着吧.

. . .

相关推荐

额外说明

eclipse打开文件或者目录位置(不使用插件)

原文链接 首先说不使用插件的方法 WINDOWS eclipse配置     Run-->External Tools-->External Tools Configurations…     new 一个 program(比如名字叫 open_file

额外说明

强化学习从基础到进阶--案例与实践[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍:【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现

额外说明

【C++】详细讲解C++的程序流程控制~

大家好,我是卷心菜。本篇主要讲解C++的流程控制,如果您看完文章有所收获,可以三连支持博主哦~,嘻嘻。 文章目录 一、前言 二、选择结构 1、if语句 2、三目运算符 3、switch语句 三、循环结构 1、while循环语句 2、do...while循

额外说明

【Three.js入门】处理动画、尺寸自适应、双击进入/退出全屏(Clock跟踪时间,Gsap动画库,自适应画面,进入/退出全屏)

个人简介 -个人主页: 前端杂货铺 -‍♂️学习方向: 主攻前端方向,也会涉及到服务端 -个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) -未来打算: 为中国的工业软件事业效力n年 -推荐学习:-前端面试宝典 -Vue2 -Vue3 -Vu

额外说明

[设计模式-行为型]中介者模式(Mediator)

一句话 又翻译成调停者模式。 就是类似房产中介, 买房、卖方不需要双方直接交涉,交给中介。 概括 解析 MEDIATOR—四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给我,一

额外说明

状态模式(State Pattern)

  一、状态模式简介(Brief Introduction) 状态模式(State Pattern),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 二、解决的问题(What To Solve) 状态模式主要解决的是当控制一个对

额外说明

Windows系统缺少tcpmib.dll文件出现系统异常问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个tcpmib.dll文件(挑

额外说明

ios运行时系列method_exchangeImplementations方法

- (void)viewDidLoad { [super viewDidLoad]; Method m1 = class_getInstanceMethod([self class], @selector(method1));

ads via 小工具