开始使用Commons Chain 运用讲解
作为程序开发人员,我们经常需要对一个实际上程序性的系统应用面向对象的方法。商业分析家和管理人员描述这样的系统时通常不使用类层次和序列图,而是使用流程图和工作流图表。但是不论如何,使用面向对象的方法解决这些问题时会带来更多的灵活性。面向对象的设计模式提供了有用的结构和行为来描述这种顺序的处理,比如模版方法(template method)[gof]和责任链(chain of responsibility)[gof]。
jakarta commons的子项目chain将上述两个模式组合成一个可复用的java框架用于描述顺序的处理流程。这个在jakarta commons project社区中开发的框架,已经被广泛的接受并且使用于许多有趣的应用中,特别的是他被struts和shale应用框架作为处理http请求处理的基础机制。你可以在需要定义和执行一组连续的步骤时使用commons chain。
至于经典设计模式,开发者和架构师普遍使用模版方法(template method)造型顺序处理。模版方法(template method)中使用一个抽象的父类定义使用的算法:处理的步骤,具体实现交给子类。当然,父类也可以为算法所使用的方法提供一个缺省实现。
由于模版方法(template method)依赖继承--子类必须继承定义了算法的父类--因此使用这个模式的软件表现出紧耦合而且缺少灵活性。又由于实现类添加自己的行为前必须扩展父类,沟每�⑷嗽北幌拗朴诶嗖愦沃校�佣�拗屏顺绦蛏杓频牧榛钚浴�ommons chain使用配置文件定义算法,在程序运行时解析配置文件,从而很好的解决了这个问题。
现在来看一下commons chain是怎样工作的,我们从一个人造的例子开始:二手车销售员的商业流程。下面是销售流程的步骤:
1.得到用户信息
2.试车
3.谈判销售
4.安排财务
5.结束销售
现在假设使用模版方法(template method)造型这个流程。首先建立一个定义了算法的抽象类:
清单1
public abstract class sellvehicletemplate {
public void sellvehicle() {
getcustomerinfo();
testdrivevehicle();
negotiatesale();
arrangefinancing();
closesale();
}
public abstract void getcustomerinfo();
public abstract void testdrivevehicle();
public abstract void negotiatesale();
public abstract void arrangefinancing();
public abstract void closesale();[来源 www.iocblog.net]
}
现在来看一下怎样用commons chain实现这个流程。首先,下载commons chain。你可以直接下载最新的zip或tar文件,也可以从cvs或者subversion源码库检出commons chain模块得到最新的代码。解压缩打包文件,将commons-chain.jar放入你的classpath中。
使用commons chain实现这个商业流程,必须将流程中的每一步写成一个类,这个类需要有一个public的方法execute()。这和传统的命令模式(command pattern)实现相同。下面简单实现了"得到用户信息":
清单2
package com.jadecove.chain.sample;
import org.apache.commons.chain.command;
import org.apache.commons.chain.context;
public class getcustomerinfo implements command {
public boolean execute(context ctx) throws exception {
system.out.println("get customer info");
ctx.put("customername","george burdell");
return false;
}
}
由于只是演示,这个类并没有做很多工作。这里将用户名放入了context对象ctx中。这个context对象连接了各个命令。暂时先将这个对象想象成根据关键字存取值的哈希表。所有后来的命令可以通过它访问刚才放入的用户名。testdrivevehicle,negotiatesale和arrangefinancing命令的实现只是简单的打印了将执行什么操作。
清单3
package com.jadecove.chain.sample;
import org.apache.commons.chain.command;
import org.apache.commons.chain.context;
public class testdrivevehicle implements command {
public boolean execute(context ctx) throws exception {
system.out.println("test drive the vehicle");
return false;
}
}
public class negotiatesale implements command {
public boolean execute(context ctx) throws exception {
system.out.println("negotiate sale");
return false;
}
}
public class arrangefinancing implements command {
public boolean execute(context ctx) throws exception {
system.out.println("arrange financing");
return false;
}
}
closesale从context对象中取出getcustomerinfo放入的用户名,并将其打印。
Tag: jakarta
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。