可以在你需要定义和执行一些顺序操作的时候采用Commons Chain。
下载地址:http://commons.apache.org/downloads/download_chain.cgi
五个工作类:
GetCustomerInfo.jar
package
demo.chain;
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
public class GetCustomerInfo implements Command ... {
public boolean execute(Context context) throws Exception ...{
System.out.println("Get customer info");
context.put("customerName","George Burdell");
return false;
}
}
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
public class GetCustomerInfo implements Command ... {
public boolean execute(Context context) throws Exception ...{
System.out.println("Get customer info");
context.put("customerName","George Burdell");
return false;
}
}
TestDriveVehicle.jar
package
demo.chain;
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
public class TestDriveVehicle implements Command ... {
public boolean execute(Context context) throws Exception ...{
System.out.println("Test drive the vehicle");
return false;
}
}
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
public class TestDriveVehicle implements Command ... {
public boolean execute(Context context) throws Exception ...{
System.out.println("Test drive the vehicle");
return false;
}
}
NegotiateSale.jar
package
demo.chain;
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
public class NegotiateSale implements Command ... {
public boolean execute(Context context) throws Exception ...{
System.out.println("Negotiate sale");
return false;
}
}
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
public class NegotiateSale implements Command ... {
public boolean execute(Context context) throws Exception ...{
System.out.println("Negotiate sale");
return false;
}
}
ArrangeFinancing.jar
package
demo.chain;
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
public class ArrangeFinancing implements Command ... {
public boolean execute(Context context) throws Exception ...{
System.out.println("Arrange financing");
return false;
}
}
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
public class ArrangeFinancing implements Command ... {
public boolean execute(Context context) throws Exception ...{
System.out.println("Arrange financing");
return false;
}
}
CloseSale.jar
package
demo.chain;
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
public class CloseSale implements Command ... {
public boolean execute(Context context) throws Exception ...{
System.out.println("Congratulations " +context.get("customerName") +", you bought a new car!");
return false;
}
}
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
public class CloseSale implements Command ... {
public boolean execute(Context context) throws Exception ...{
System.out.println("Congratulations " +context.get("customerName") +", you bought a new car!");
return false;
}
}
测试代码:
package
demo;
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
import org.apache.commons.chain.impl.ChainBase;
import org.apache.commons.chain.impl.ContextBase;
import demo.chain.ArrangeFinancing;
import demo.chain.CloseSale;
import demo.chain.GetCustomerInfo;
import demo.chain.NegotiateSale;
import demo.chain.TestDriveVehicle;
public class SellVehicleChain extends ChainBase ... {
public SellVehicleChain() ...{
super();
addCommand(new GetCustomerInfo());
addCommand(new TestDriveVehicle());
addCommand(new NegotiateSale());
addCommand(new ArrangeFinancing());
addCommand(new CloseSale());
}
public static void main(String[] args) throws Exception ...{
Command process = new SellVehicleChain();
Context ctx = new ContextBase();
process.execute(ctx);
}
}
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
import org.apache.commons.chain.impl.ChainBase;
import org.apache.commons.chain.impl.ContextBase;
import demo.chain.ArrangeFinancing;
import demo.chain.CloseSale;
import demo.chain.GetCustomerInfo;
import demo.chain.NegotiateSale;
import demo.chain.TestDriveVehicle;
public class SellVehicleChain extends ChainBase ... {
public SellVehicleChain() ...{
super();
addCommand(new GetCustomerInfo());
addCommand(new TestDriveVehicle());
addCommand(new NegotiateSale());
addCommand(new ArrangeFinancing());
addCommand(new CloseSale());
}
public static void main(String[] args) throws Exception ...{
Command process = new SellVehicleChain();
Context ctx = new ContextBase();
process.execute(ctx);
}
}
也可以使用xml文件进行配置:新建chain-config.xml文件如下:
<
catalog
>
< chain name ="sell-vehicle" >
< command id ="GetCustomerInfo" className ="demo.chain.GetCustomerInfo" />
< command id ="TestDriveVehicle" className ="demo.chain.TestDriveVehicle" />
< command id ="NegotiateSale" className ="demo.chain.NegotiateSale" />
< command id ="ArrangeFinancing" className ="demo.chain.ArrangeFinancing" />
< command id ="CloseSale" className ="demo.chain.CloseSale" />
</ chain >
</ catalog >
< chain name ="sell-vehicle" >
< command id ="GetCustomerInfo" className ="demo.chain.GetCustomerInfo" />
< command id ="TestDriveVehicle" className ="demo.chain.TestDriveVehicle" />
< command id ="NegotiateSale" className ="demo.chain.NegotiateSale" />
< command id ="ArrangeFinancing" className ="demo.chain.ArrangeFinancing" />
< command id ="CloseSale" className ="demo.chain.CloseSale" />
</ chain >
</ catalog >
新建SellVehicleContext.jar文件
package
demo;
import org.apache.commons.chain.impl.ContextBase;
public class SellVehicleContext extends ContextBase ... {
private static final long serialVersionUID = 6954127190729021870L;
private String customerName;
public String getCustomerName() ...{
return customerName;
}
public void setCustomerName(String name) ...{
this.customerName = name;
}
}
import org.apache.commons.chain.impl.ContextBase;
public class SellVehicleContext extends ContextBase ... {
private static final long serialVersionUID = 6954127190729021870L;
private String customerName;
public String getCustomerName() ...{
return customerName;
}
public void setCustomerName(String name) ...{
this.customerName = name;
}
}
测试类如下:
package
demo;
import org.apache.commons.chain.Catalog;
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
import org.apache.commons.chain.config.ConfigParser;
import org.apache.commons.chain.impl.CatalogFactoryBase;
public class CatalogLoader ... {
private static final String CONFIG_FILE = "/demo/chain-config.xml";
private ConfigParser parser;
private Catalog catalog;
public CatalogLoader() ...{
parser = new ConfigParser();
}
public Catalog getCatalog() throws Exception ...{
if (catalog == null) ...{
parser.parse(this.getClass().getResource(CONFIG_FILE));
}
catalog = CatalogFactoryBase.getInstance().getCatalog();
return catalog;
}
public static void main(String[] args) throws Exception ...{
CatalogLoader loader = new CatalogLoader();
Catalog sampleCatalog = loader.getCatalog();
Command command = sampleCatalog.getCommand("sell-vehicle");
Context ctx = new SellVehicleContext();
command.execute(ctx);
}
}
import org.apache.commons.chain.Catalog;
import org.apache.commons.chain.Command;
import org.apache.commons.chain.Context;
import org.apache.commons.chain.config.ConfigParser;
import org.apache.commons.chain.impl.CatalogFactoryBase;
public class CatalogLoader ... {
private static final String CONFIG_FILE = "/demo/chain-config.xml";
private ConfigParser parser;
private Catalog catalog;
public CatalogLoader() ...{
parser = new ConfigParser();
}
public Catalog getCatalog() throws Exception ...{
if (catalog == null) ...{
parser.parse(this.getClass().getResource(CONFIG_FILE));
}
catalog = CatalogFactoryBase.getInstance().getCatalog();
return catalog;
}
public static void main(String[] args) throws Exception ...{
CatalogLoader loader = new CatalogLoader();
Catalog sampleCatalog = loader.getCatalog();
Command command = sampleCatalog.getCommand("sell-vehicle");
Context ctx = new SellVehicleContext();
command.execute(ctx);
}
}
Chain简明手册:http://blog.donews.com/foxgem/archive/2005/08/05/495938.aspx