Apache Commons Chain 简单介绍

Commons Chain 介绍

Chain of Responsibility(CoR)模式也叫职责链模式或者职责连锁模式,是由GoF提出的23种软件设计模式的一种。Chain of Responsibility模式是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。

Apache Commons Chain 核心组件

在这里插入图片描述

1、 Context接口

Context表示命令执行的上下文,在命令间实现共享信息的传递。 extends Map,父接口是Map,它只是一个标记接口。ContextBase实现了Context。对于web环境,可以使用WebContext类及其子类(FacesWebContext、PortletWebContext和ServletWebContext)。

2、Command接口

Commons Chain中最重要的接口,表示在Chain中的具体某一步要执行的命令。它只有一个方法:boolean execute(Context context)。如果返回true,那么表示Chain的处理结束,Chain中的其他命令不会被调用;返回false,则Chain会继续调用下一个Command,直到:



        Command返回true;
        Command抛出异常;
        Chain的末尾;

3、Chain接口

它表示“命令链”,chain of command,要在其中执行的命令,需要先添加到Chain中,父接口是Command , ChainBase实现了它。

4、Filter接口

extends 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

5、Catalog接口

它是逻辑命名的Chain和Command集合。通过使用它,Command的调用者不需要了解具体实现Command的类名,通过配置文件类加载chain of command 或者command。通过catalog.getCommand(commandName)获取Command。

三、Commons Chain 基本使用

现在,我们模拟一个购车的例子来看一下chain是工作实现。购车分为:用户信息的获取、试车、销售讨论、付款以及结束交易。 五个工作类如下:

1. GetUserInfo.class

在这里插入图片描述

2. TestDriver.class

3. NegotiateSale.class

在这里插入图片描述

4. ArrangeFinancing.class

在这里插入图片描述

5. CloseSale.class

在这里插入图片描述
另外,我们也顺便在添加两个Filter进去,filter代码如下:

Filter1.class

在这里插入图片描述

Filter2.class

在这里插入图片描述

要运行上述的流程可以有两种方式,分别是采用配置文件和使用注册命令来运行chain。

首先,我们采用注册命令来运行,代码如下:在这里插入图片描述
运行结果为:
在这里插入图片描述
通过运行结果可以看出chain链运行的顺序是按照添加command的顺序执行的,而且Filter的执行execute的顺序与Filter出现在Chain中出现的位置一致,但是执行postprocess顺序与之相反。如:如果连续定义了filter1和filter2,那么execute的执行顺序是:filter1 -> filter2;而postprocess的执行顺序是:filter2 -> filter1。
其次,我们再使用配置文件加载Command。 对于复杂的Chain,可能需要使用内嵌的Chain,内嵌Chain可以类比一个子过程。此时,可以使用LookupCommand。假设其中的testCommand成为一个子过程,其代码为
在这里插入图片描述
扩展后的配置文件为:
在这里插入图片描述
装配文件的代码如下:
在这里插入图片描述
运行结果为:
在这里插入图片描述
配置文件的引入,使得Commons Chain的灵活性大大的提高。在实际的使用过程中,存在着同一个Command被多个Chain使用的情形。如果每次都书写Command的类名,尤其是前面的包名特别长的情况下,是一件比较麻烦而又费时费力的一件事。而的使用就解决这样的麻烦。通过定义Command和Chain的别名,来简化书写。上面的配置文件,可以书写成:
在这里插入图片描述

总结:

Commons Chain实现了Chain of Responsebility和Command模式,其中的Catalog + 配置文件的方式使得调用方和Command的实现方的耦合度大大的降低,提高了灵活性。对于配置文件,通常可以:



        作为Command的索引表,需要时按名字索引创建实例。
        利用Chain以及内嵌Chain,完成一组连续任务和Command的复用,引入Filter可以获得与Servlet Filter一样的好处。
        使用定义别名,简化书写。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值