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

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

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

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

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

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

回滚流程如下

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

}

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

}

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

}

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

}

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

}

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

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

}

测试结果

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

相关文章
|
2天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
2天前
|
设计模式 算法 Java
Java中的设计模式及其应用
【4月更文挑战第18天】本文介绍了Java设计模式的重要性及分类,包括创建型、结构型和行为型模式。创建型模式如单例、工厂方法用于对象创建;结构型模式如适配器、组合关注对象组合;行为型模式如策略、观察者关注对象交互。文中还举例说明了单例模式在配置管理器中的应用,工厂方法在图形编辑器中的使用,以及策略模式在电商折扣计算中的实践。设计模式能提升代码可读性、可维护性和可扩展性,是Java开发者的必备知识。
|
2天前
|
安全 Java API
函数式编程在Java中的应用
【4月更文挑战第18天】本文介绍了函数式编程的核心概念,包括不可变性、纯函数、高阶函数和函数组合,并展示了Java 8如何通过Lambda表达式、Stream API、Optional类和函数式接口支持函数式编程。通过实际应用案例,阐述了函数式编程在集合处理、并发编程和错误处理中的应用。结论指出,函数式编程能提升Java代码的质量和可维护性,随着Java语言的演进,函数式特性将更加丰富。
|
3天前
|
Java API 数据库
深入解析:使用JPA进行Java对象关系映射的实践与应用
【4月更文挑战第17天】Java Persistence API (JPA) 是Java EE中的ORM规范,简化数据库操作,让开发者以面向对象方式处理数据,提高效率和代码可读性。它定义了Java对象与数据库表的映射,通过@Entity等注解标记实体类,如User类映射到users表。JPA提供持久化上下文和EntityManager,管理对象生命周期,支持Criteria API和JPQL进行数据库查询。同时,JPA包含事务管理功能,保证数据一致性。使用JPA能降低开发复杂性,但需根据项目需求灵活应用,结合框架如Spring Data JPA,进一步提升开发便捷性。
|
5天前
|
设计模式 算法 Java
小谈设计模式(30)—Java设计模式总结
小谈设计模式(30)—Java设计模式总结
|
6天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
12 1
|
8天前
|
Java
探秘jstack:解决Java应用线程问题的利器
探秘jstack:解决Java应用线程问题的利器
16 1
探秘jstack:解决Java应用线程问题的利器
|
10天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
13 0
|
11天前
|
设计模式 PHP
php设计模式--责任链模式(五)
php设计模式--责任链模式(五)
11 0
|
11天前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
25 4