其实职责链在老早就使用过了,以前在HW给Vodafone做金融项目的时候,使用职责链完成交易步骤,那时觉得这东西真好用,可以直接通过配置决定业务流程,现在终于有机会实践一下。

 
    
    这种设计模式本身的实现是非常容易的,可以简单单做是一组IF条件的集合,符合条件的继续传递;不符合条件的终止运行。chain代表了一条运行逻辑,就如同一条项链,我们的业务逻辑就如同是珍珠,并且都实现了同样的compute接口。apache的实现,是通过将数据封装到上下文(context)中,而且该上下文就是串起这些珍珠的金线。
 
    下面是自己写的一段例子:
 
 链的组织,也可以通过配置xml文件来实现,用在spring框架中非常合适。
 
/**
* 职责链的组织类,负责构造整个链
*/
public class RootCauseChain extends ChainBase
{
/**
* 通过此方法增减生效的分析器
*/
public RootCauseChain()
{
addCommand(new DataRootCauseAnalyzer());
//addCommand(new EnvRootCauseAnalyzer());
//addCommand(new PifRootCauseAnalyzer());
//addCommand(new TaskRootCauseAnalyzer());
}
}

具体的业务:  

/**
* 实现了command接口,数据均通过context组织
*/
public class DataRootCauseAnalyzer implements Command
{
private DataQueryService dqService = new DataQueryService(); private static final String ROOT_CAUSE_FORMAT = "indicator value is abnormal: check ? for more information"; @SuppressWarnings("unchecked")
@Override
public boolean execute(Context arg0) throws Exception
{
boolean res = false; Log.info(RootCauseConstant.MODULE_CODE, "0000",
"begin to execute DataRootCauseAnalyzer.execute"); List<DataPoint> exceptionDataPoints = (List<DataPoint>) arg0.get("expData");
ExceptionRule exceptionRule = (ExceptionRule) arg0.get("rule"); List<RootCause> result = new ArrayList<RootCause>(); if (exceptionDataPoints != null && !exceptionDataPoints.isEmpty())
{
for (DataPoint dataPoint : exceptionDataPoints)
{
List<RootCause> rootCauseList = generateRootCause(dataPoint, exceptionRule); result.addAll(rootCauseList);
}
} // 如果分析出了根因,则结束分析流程
if (result != null && !result.isEmpty())
{
arg0.put("result", result); res = true;
} // 没有分析出根因,交到下一个分析器进行分析
return res;
} /**
* 生成具体的异常信息
*
* @param exceptionPoint
* 异常数据点
* @param rule
* 异常规则
* @return 查询上下级关系
*/
private List<RootCause> generateRootCause(DataPoint exceptionPoint, ExceptionRule rule)
{
List<RootCause> rclist = new ArrayList<RootCause>(); return rclist;
}
}

  调用:

public class RootCauseService
{
/**
* 分析异常点的根因
*
* @param points
* 异常数据点
* @param rule
* 异常数据发现规则
* @return 异常数据点及根因
*/
@SuppressWarnings("unchecked")
public List<RootCause> getRootCause(List<DataPoint> points, ExceptionRule rule)
{
Log.info(RootCauseConstant.MODULE_CODE, "0000", "begin to execute getRootCause, points="
+ points + ", rule=" + rule); List<RootCause> result = new ArrayList<RootCause>(); try
{
Command command = new RootCauseChain();
ContextBase ctx = new ContextBase(); ctx.put("expData", points);
ctx.put("rule", rule); command.execute(ctx);
result = (List<RootCause>) ctx.get("result");
}
catch (Exception e)
{
Log.error(RootCauseConstant.MODULE_CODE, "0000",
"execute analysisRootCauseByCommandChain exception.", e);
} Log.info(RootCauseConstant.MODULE_CODE, "0000", "execute getRootCause finished, result="
+ result); return result;
}
}

 

职责链实现的apache.chain使用的更多相关文章

  1. OOP设计模式[JAVA]——03职责链模式

    职责链模式 Responsibility of Chain 在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求 ...

  2. 18职责链模式CoR

    一.什么是职责链模式 Chain of Responsibility(CoR)模式也叫职 责链模式或者职责连锁模式,是行为模式之一, 该模式构造一系列分别担当不同的职责的类的对 象来共同完成一个任务, ...

  3. js职责链模式

    职责链模式(Chain of Responsiblity),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为 ...

  4. C#设计模式系列:职责链模式(Chain of Responsibility)

    1.职责链模式简介 1.1>.定义 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对 ...

  5. 职责链(Chain of Responsibility)模式在航空货运中的运用实例

    设计模式这东西,基本上属于“看懂一瞬间,用会好几年”.只有实际开发中,当某一模式很好的满足了业务需求时,才会有真切的感觉.借用一句<闪电侠>中,绿箭侠教导闪电侠的台词:“不是你碰巧遇到了它 ...

  6. 深入浅出设计模式——职责链模式(Chain of Responsibility Pattern)

    模式动机 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传 ...

  7. atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...

  8. 设计模式:职责链模式(Chain Of Responsibility)

    定  义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 结构图: 处理请求类: //抽象处理类 abs ...

  9. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

随机推荐

  1. javascript 事件的学习

    1.事件绑定: addEventListener , removeEventListener.是dom2级别的事件绑定 attachEvent , detachEvent 是IE的事件绑定. 2. 事 ...

  2. hadoop filesystem 删除文件 复制文件 重命名文件

    private void moveFile(Configuration conf, String Path1, String Path2, String newname ) throws IOExce ...

  3. PHP加解密相关函数

    openssl_public_encrypt()  - Encrypts data with public keyopenssl_public_decrypt()  - Decrypts data w ...

  4. 前端构建工具gulp入门教程

    本文假设你之前没有用过任何任务脚本(task runner)和命令行工具,一步步教你上手Gulp.不要怕,它其实很简单,我会分为五步向你介绍gulp并帮助你完成一些惊人的事情.那就直接开始吧. 第一步 ...

  5. java 中的this关键字的几种用法

    转自:http://blog.csdn.net/anmei2010/article/details/4091227 1.     当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在 ...

  6. C语言socket编程--每日签到

    前几天写了个python的每日签到,你运行还得借助crontab,很是不爽.....正好前几天看了个关于c编写daemon进程,加上自己那点可怜的socket知识,于是我们重操旧页,C语言版的每日签到 ...

  7. jsp日期控件My97DatePicker的使用

    My97DatePicker是一款非常灵活好用的日期控件.使用非常简单. 1.下载My97DatePicker组件包 2.将My97DatePicker包放在项目WebContent目录下 3.在页面 ...

  8. Eval 表达式 GridView ItemCommand

    <asp:TemplateColumn HeaderText="查看审批数据">    <ItemTemplate>     <a onclick=& ...

  9. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(六)

    使用 HttpApplication 对象 ASP.NET 框架中的许多类都提供了许多很方便的属性可以直接映射到 HttpContext 类中定义的属性.这种交叠有一个很好的例子就是 HttpAppl ...

  10. 1201: [HNOI2005]数三角形 - BZOJ

    Description Input 大三角形的所有短边可以看成由(n+1)*n/2个单位三角形的边界组成.如下图的灰色三角形所示.其中第1排有1个灰色三角形,第2排有2个灰色三角形,……,第n排有n个 ...