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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
怎样做网站性能优化?
前言 对于一个网站来说,优化是我们持续关注的话题,今天浅谈一下网站的性能优化。 一、WEB前端性能优化 1.1、浏览器访问优化 1、减少HTTP访问请求 HTTP协议是无状态的应用层协议,也就是每次请求都需要建立通信链路,进行数据传输,在服务器端,每个HTTP都需要启动独立的线程去处理,这样会严重影响服务器性能,也降低了响应速度,所以我们需要减少HTTP请求的数目可提高访问性能。 减少HTTP的主要方式就是合并CSS、JavaScript、图片,将游览器一次访问需要的JavaScript、CSS合并成一个文件,多张图片合并成一张图片,这样就减少了HTTP的访问请求,达到了访问优化的效果。 2、使用游览器缓存 对于一个网站来说,Logo、CSS、JavaScript、图标这些静态资源更新的频率都很低,这些请求又是每次HTTP请求不可缺少的元素,所以可以根据HTTP头中Cache-Control和Expires的属性,设置游览器的缓存天数。 在某些时候,网站的静态资源文件需要做修改,此时对于没有做个优化的人来说肯定是修改完静态资源以后,然后缓存清掉(我之前在的公司就是这样做的,那时候技术真...
- 下一篇
JAVA设计模式之工厂模式
JAVA设计模式之工厂模式—Factory Pattern 1.工厂模式简介 工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦。 2.工厂模式分类 这里以制造coffee的例子开始工厂模式设计之旅。 我们知道coffee只是一种泛举,在点购咖啡时需要指定具体的咖啡种类:美式咖啡、卡布奇诺、拿铁等等。 /** * * 拿铁、美式咖啡、卡布奇诺等均为咖啡家族的一种产品 * 咖啡则作为一种抽象概念 * @author Lsj * */ public abstract class Coffee { /** * 获取coffee名称 * @return */ public abstract String getName(); } /** * 美式咖啡 * @author Lsj * */ public class Americano extends Coffee { @Override public String getName() { return "美式咖啡"; } } /** * 卡布奇诺 * @author Lsj * */ public class Cappuccino ext...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,CentOS7官方镜像安装Oracle11G
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池