其实职责链在老早就使用过了,以前在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. angularjs--$watch、$watchGroup、$watchCollection含义

    angularjs的$watch.$watchGroup.$watchCollection使用方式   如果想在controller里面随时监听一个值的变化那就用$watch <p>    ...

  2. 手把手教你写LKM rookit! 之 第一个lkm程序及模块隐藏(一)

    唉,一开始在纠结起个什么名字,感觉名字常常的很装逼,于是起了个这<手把手教你写LKM rookit> 我觉得: 你们觉得:...... 开始之前,我们先来理解一句话:一切的操作都是系统调用 ...

  3. 浅谈string

    #include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件 using std::string;using ...

  4. ISBN

    问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位 ...

  5. ARCGIS 10中添加excel点字段生产点shp文件的工具

    菜单栏中——文件——添加数据——添加XY数据——选择excel。 选择x,y和投影(注意这里投影应该是原数据的本身投影,不能直接选择你要转换的投影)完成。

  6. 总有你需要的之 ios 小技巧 (下)

    图片上绘制文字 写一个UIImage的category NSMutableParagraphStyle* paragraphStyle = [[NSParagraphStyle defaultPara ...

  7. 2329: [HNOI2011]括号修复 - BZOJ

    恶心的splay,打标记的时候还有冲突,要特别小心 上次写完了,查了半天没查出错来,于是放弃 今天对着标程打代码,终于抄完了,我已经不想再写了 const maxn=; type node=recor ...

  8. mybatis 中mapper 的namespace有什么用

    原文:http://zhidao.baidu.com/link?url=ovFuTn7-02s7Qd40BOnwHImuPxNg8tXJF3nrx1SSngNY5e0CaSP1E4C9E5J6Xv5f ...

  9. dragsort拖动排序

    引入文件jQuery.jquery.dragsort-0.5.2.min.js html文件: css文件: ul { margin:0px; padding:0px; margin-left:20p ...

  10. CNKI翻译助手-连接数据库失败

    IP并发数限制,老师说西工大的CNKI才20个并发指标,HPU自不必说.但是我略表怀疑,这只是翻译助手而已,就像百度翻译和百度数据库的区别,如何验证呢?去校外用该助手,如果能用,那么就不是IP并发限制 ...