Java设计模式应用_责任链模式

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的。在性能告警模块开发过程中,创建一条告警规则需要执行阈值解析,中间表生成,流任务生成,规则入库,告警事件入库等诸多操作。如果把这些步骤糅合在一个类中,代码可读性及复杂度往往是灾难的,特别对于这么多步骤的事务性操作,更是力不从心。

生产一个产品,需要依次执行多个步骤,才能完成,那么是使用责任链模式则是极好的。

在性能告警模块开发过程中,创建一条告警规则需要执行阈值解析,中间表生成,流任务生成,规则入库,告警事件入库等诸多操作。如果把这些步骤糅合在一个类中,代码可读性及复杂度往往是灾难的,特别对于这么多步骤的事务性操作,更是力不从心。使用责任链模式,上述问题迎刃而解。

以告警规则创建为例子,简化流程如下

阈值解析 ---> 流任务生成 ---> 规则入库

回滚流程如下

1、 阈值解析失败:回滚阈值解析。

2、 流任务生产失败:回滚流任务生成,阈值解析。

3、 规则入库失败:回滚规则入库,流任务生成,阈值解析。

采用责任链模式编码,思路如下:

1、 编写阈值解析处理器,流任务生成处理器,规则入库处理器,每个处理器包含业务处理方法和回滚方法;

2、 一个处理器业务代码执行完成后主动调用下一个处理器业务方法;

3、 一个处理器业务代码执行失败主动调用本处理器回滚方法,本处理器回滚完成后主动调用上一个处理器回滚方法。

代码如下

1、 抽象处理器

package com.coshaho.learn.handler;

/**
 * 
 * AbstractRuleHandler.java Create on 2017年5月5日 下午11:20:15    
 *    
 * 类功能说明: 告警规则责任链处理节点抽象类
 *
 * Copyright: Copyright(c) 2013 
 * Company: COSHAHO
 * @Version 1.0
 * @Author coshaho
 */
public abstract class AbstractRuleHandler 
{
    // 上一个处理器
    private AbstractRuleHandler preHandler;
    
    // 下一个处理器
    private AbstractRuleHandler nextHandler;
    
    /**
     * 业务执行
     * 
     * @author coshaho 
     * @param rule
     */
    public void doHandle(AlarmRule rule)
    {
        try
        {
            doHandleReal(rule);
        }
        catch(Exception e)
        {
            // 业务代码执行失败主动回滚
            rollBack(rule);
            return;

        }
        
        // 业务代码执行成功主动调用下一个处理器处理
        if(null != nextHandler)
        {
            nextHandler.doHandle(rule);
        }
    }
    
    /**
     * 事务回滚
     * 
     * @author coshaho 
     * @param rule
     */
    public void rollBack(AlarmRule rule)
    {
        rollBackReal(rule);
        // 本处理器业务回滚完成,主动调用前一个处理器业务回滚
        if(null != preHandler)
        {
            preHandler.rollBack(rule);
        }
    }
    
    /**
     * 每个处理器特有的业务处理方法
     * 
     * @author coshaho 
     * @param rule
     * @throws Exception
     */
    public abstract void doHandleReal(AlarmRule rule) throws Exception;
    
    /**
     * 每个处理器特有的业务回滚方法
     * 
     * @author coshaho 
     * @param rule
     */
    public abstract void rollBackReal(AlarmRule rule);

    private AbstractRuleHandler setPreHandler(AbstractRuleHandler preHandler) 
    {
        this.preHandler = preHandler;
        return preHandler;
    }

    public AbstractRuleHandler setNextHandler(AbstractRuleHandler nextHandler) 
    {
        this.nextHandler = nextHandler;
        nextHandler.setPreHandler(this);
        return nextHandler;
    }

}
AI 代码解读

2、阈值解析处理器

package com.coshaho.learn.handler;

import org.apache.commons.lang.StringUtils;

/**
 * 
 * ThresholdParseHandler.java Create on 2017年5月5日 下午11:41:20    
 *    
 * 类功能说明:   阈值解析
 *
 * Copyright: Copyright(c) 2013 
 * Company: COSHAHO
 * @Version 1.0
 * @Author coshaho
 */
public class ThresholdParseHandler extends AbstractRuleHandler
{

    @Override
    public void doHandleReal(AlarmRule rule) throws Exception 
    {
        if(StringUtils.isEmpty(rule.getThreshold()))
        {
            throw new Exception("Threshold is empty.");
        }
        System.out.println("Parse threshold success. Threshold is " + rule.getThreshold());
    }

    @Override
    public void rollBackReal(AlarmRule rule) 
    {
        System.out.println("Roll parse threshold. Threshold is " + rule.getThreshold());
    }

}
AI 代码解读

3、流任务生成处理器

package com.coshaho.learn.handler;

/**
 * 
 * StreamGenerateHandler.java Create on 2017年5月5日 下午11:41:43    
 *    
 * 类功能说明:   告警流规则生成
 *
 * Copyright: Copyright(c) 2013 
 * Company: COSHAHO
 * @Version 1.0
 * @Author coshaho
 */
public class StreamGenerateHandler extends AbstractRuleHandler 
{

    @Override
    public void doHandleReal(AlarmRule rule) throws Exception 
    {
        System.out.println("Generate stream success.");
    }

    @Override
    public void rollBackReal(AlarmRule rule) 
    {
        System.out.println("Roll Generate stream.");
    }

}
AI 代码解读

4、规则入库处理器

package com.coshaho.learn.handler;

import org.apache.commons.lang.StringUtils;

/**
 * 
 * RulePesistHandler.java Create on 2017年5月5日 下午11:41:08    
 *    
 * 类功能说明:   告警规则持久化
 *
 * Copyright: Copyright(c) 2013 
 * Company: COSHAHO
 * @Version 1.0
 * @Author coshaho
 */
public class RulePesistHandler extends AbstractRuleHandler 
{

    @Override
    public void doHandleReal(AlarmRule rule) throws Exception {
        if(StringUtils.isEmpty(rule.getName()))
        {
            throw new Exception("Rule name is empty.");
        }
        System.out.println("Persist rule success. Rule name is " + rule.getName());
    }

    @Override
    public void rollBackReal(AlarmRule rule) {
        System.out.println("Roll persist rule. Rule name is " + rule.getName());
        
    }

}
AI 代码解读

5、规则入库处理器

package com.coshaho.learn.handler;

import org.apache.commons.lang.StringUtils;

/**
 * 
 * RulePesistHandler.java Create on 2017年5月5日 下午11:41:08    
 *    
 * 类功能说明:   告警规则持久化
 *
 * Copyright: Copyright(c) 2013 
 * Company: COSHAHO
 * @Version 1.0
 * @Author coshaho
 */
public class RulePesistHandler extends AbstractRuleHandler 
{

    @Override
    public void doHandleReal(AlarmRule rule) throws Exception {
        if(StringUtils.isEmpty(rule.getName()))
        {
            throw new Exception("Rule name is empty.");
        }
        System.out.println("Persist rule success. Rule name is " + rule.getName());
    }

    @Override
    public void rollBackReal(AlarmRule rule) {
        System.out.println("Roll persist rule. Rule name is " + rule.getName());
        
    }

}
AI 代码解读

6、告警规则

package com.coshaho.learn.handler;

/**
 * 
 * AlarmRule.java Create on 2017年5月5日 下午11:40:50    
 *    
 * 类功能说明:  告警规则
 *
 * Copyright: Copyright(c) 2013 
 * Company: COSHAHO
 * @Version 1.0
 * @Author coshaho
 */
public class AlarmRule 
{
    private String name;
    
    private String type;
    
    private String threshold;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getThreshold() {
        return threshold;
    }
    public void setThreshold(String threshold) {
        this.threshold = threshold;
    }
}
AI 代码解读

7、规则创建责任链

package com.coshaho.learn.handler;

/**
 * 
 * AlarmRuleCreator.java Create on 2017年5月5日 下午11:56:45    
 *    
 * 类功能说明:   告警规则创建
 *
 * Copyright: Copyright(c) 2013 
 * Company: COSHAHO
 * @Version 1.0
 * @Author coshaho
 */
public class AlarmRuleCreator 
{
    private AbstractRuleHandler alarmRuleHandler;
    public AlarmRuleCreator()
    {
        alarmRuleHandler = new ThresholdParseHandler();
        alarmRuleHandler.setNextHandler(new StreamGenerateHandler())
                .setNextHandler(new RulePesistHandler());
    }
    
    public void create(AlarmRule rule)
    {
        alarmRuleHandler.doHandle(rule);
    }
    public static void main(String[] args)
    {
        AlarmRule rule = new AlarmRule();
        rule.setThreshold("cpuRate < 10");
        rule.setName("Cpu Alarm");
        
        AlarmRuleCreator ruleCreator = new AlarmRuleCreator();
        ruleCreator.create(rule);
        System.out.println();
        
        rule.setName("");
        ruleCreator.create(rule);
    }

}
AI 代码解读

测试结果

Parse threshold success. Threshold is cpuRate < 10
Generate stream success.
Persist rule success. Rule name is Cpu Alarm

Parse threshold success. Threshold is cpuRate < 10
Generate stream success.
Roll persist rule. Rule name is 
Roll Generate stream.
Roll parse threshold. Threshold is cpuRate < 10
AI 代码解读

目录
打赏
0
1
0
0
56
分享
相关文章
Java也能快速搭建AI应用?一文带你玩转Spring AI可落地性
Java语言凭借其成熟的生态与解决方案,特别是通过 Spring AI 框架,正迅速成为 AI 应用开发的新选择。本文将探讨如何利用 Spring AI Alibaba 构建在线聊天 AI 应用,并实现对其性能的全面可观测性。
Java和Python在企业中的应用情况
Java和Python在企业中的应用情况
117 7
「全网最细 + 实战源码案例」设计模式——责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,允许将请求沿着处理者链进行发送。每个处理者可以处理请求或将其传递给下一个处理者,从而实现解耦和灵活性。其结构包括抽象处理者(Handler)、具体处理者(ConcreteHandler)和客户端(Client)。适用于不同方式处理不同种类请求、按顺序执行多个处理者、以及运行时改变处理者及其顺序的场景。典型应用包括日志处理、Java Web过滤器、权限认证等。
58 13
「全网最细 + 实战源码案例」设计模式——责任链模式
CRaC技术助力ACS上的Java应用启动加速
容器计算服务借助ACS的柔性算力特性并搭配CRaC技术极致地提升Java类应用的启动速度。
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
166 9
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
47 5
【潜意识Java】了解并详细分析Java与AIGC的结合应用和使用方式
本文介绍了如何将Java与AIGC(人工智能生成内容)技术结合,实现智能文本生成。
122 5
【潜意识Java】深入理解MyBatis,从基础到高级的深度细节应用
本文详细介绍了MyBatis,一个轻量级的Java持久化框架。内容涵盖MyBatis的基本概念、配置与环境搭建、基础操作(如创建实体类、Mapper接口及映射文件)以及CRUD操作的实现。此外,还深入探讨了高级特性,包括动态SQL和缓存机制。通过代码示例,帮助开发者更好地掌握MyBatis的使用技巧,提升数据库操作效率。总结部分强调了MyBatis的优势及其在实际开发中的应用价值。
37 1
|
3月前
|
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
95 2
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等