apache 职责链 使用

一、 common chain 简介

        我们经常需要对一个实际上程序性的系统应用面向对象的方法。商业分析家和管理人员描述这样的系统时通常不使用类层次和序列图,而是使用流程图和工作流图表。但是不论如何,使用面向对象的方法解决这些问题时会带来更多的灵活性。面向对象的设计模式提供了有用的结构和行为来描述这种顺序的处理,比如模版方法(Template Method)和责任链(Chain of Responsibility)。
        模版方法(Template Method)造型顺序处理。模版方法(Template Method)中使用一个抽象的父类定义使用的算法:处理的步骤,具体实现交给子类。当然,父类也可以为算法所使用的方法提供一个缺省实现。         
        职责链模式是由GoF提出的23种软件设计模式的一种,是行为模式之一。该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式.。
        Jakarta Commons的子项目Chain将上述两个模式组合成一个可复用的Java框架用于描述顺序的处理流程。可以使得客户端在处理的过程不需要关心是使用一个command还是 一系列的command。通过 Liskov 代换原则,chain implement command,在使用command的地方都可以使用chain。
         这个在Jakarta Commons project社区中开发的框架,已经被广泛的接受并且使用于许多有趣的应用中,特别的是他被Struts和Shale应用框架作为处理HTTP请求处理的基础机制。你可以在需要定义和执行一组连续的步骤时使用Commons Chain

二、各个接口说明


1.Command接口。它是Commons Chain中最重要的接口,表示在Chain中的具体某一步要执行的命令。它只有一个方法:boolean execute(Context context)。如果返回true,那么表示Chain的处理结束,Chain中的其他命令不会被调用;返回false,则Chain会继续调用下一个Command,直到:
Command返回true;
Command抛出异常;
Chain的末尾;
2
.Context接口。它表示命令执行的上下文,在命令间实现共享信息的传递。Context接口的父接口是Map,ContextBase实现了Context。对于web环境,可以使用WebContext类及其子类(FacesWebContext、PortletWebContext和ServletWebContext)。
3
.Chain接口。它表示“命令链”,要在其中执行的命令,需要先添加到Chain中。Chain的父接口是Command,ChainBase实现了它。 
4
.Filter接口。它的父接口是Command,它是一种特殊的Command。除了Command的execute,它还包括一个方法:boolean postprocess(Context context, Exception exception)。Commons Chain会在执行了Filter的execute方法之后,执行postprocess(不论Chain以何种方式结束)。Filter的执行execute的顺序与Filter出现在Chain中出现的位置一致,但是执行postprocess顺序与之相反。如:如果连续定义了filter1和filter2,那么execute的执行顺序是:filter1 -> filter2;而postprocess的执行顺序是:filter2 -> filter1。

三、使用流程

下图是项目使用common chain 模式的类图。
  在spring 中的配置: chain中的类都定义好,我们还需要配置,在spring 配置文件中,配置我们的chain链,这里配置的顺序是什么,chain执行时的顺序就是什么。
<bean name="taskChain" class="org.apache.commons.chain.impl.ChainBase">
        <constructor-arg>
            <list>
                <!--开始前的数据校验-->
                <ref bean="Command1"/>
                <ref bean="Command2"/>
     <ref bean="Command3"/>
     <ref bean="Command4"/>
     <ref bean="Command5"/>                
                <ref bean="filter"/>
            </list>
        </constructor-arg>
    </bean>

  说明:
               执行的时候,只要启动chain中的execute方法,整个链就会按照在配置文件中配置的顺序依次执行,filter在最后执行,filter中的postProcess方法会进行我们之定义的扫尾的工作。其中这里的context是贯穿始终的全局上下文。

你可能感兴趣的:(apache,chain,职责链)