摘要: 现今大多项目从小型开始发展并成为大型的可升级的体系结构,但是,当体系改变时,相应的商业逻辑实现也要改变。用户接口可能不需要改变,但是为了可测量,商业逻辑必须从单纯的javaBean实现过渡到用EnterPRise JavaBeans (EJB)来实现。如果现在的应用程序没有被设计成适应商业逻辑实现的改变,大多数用户的界面代码需要更新以使用商业逻辑服务。在本篇文章,使用一个简单的框架来访问业务对象,你将会学到如果构架你的应用程序以使业务对象改变时不需要改变用户接口。 By James Carman
THE API 业务对象工厂框架最简单的部分就是他的API本身,仅有一个主类,并有一些其他的后台的类可以扩展和定制这一框架。
The BusinessObjectFactory class 除了在程序中使用的业务接口,业务对象服务的使用者只需关注一个主类BusinessObjectFactory,下面来看这个接口: public final class BusinessObjectFactory { public BusinessObjectFactory getInstace(); public Remote create( Class businessInterface ); } 正如你所见,BusinessObjectFactory类实现了一个单一设计模式,他的构造函数声明为私有,并且该类只持有一个静态实例,这样就使得BusinessObjectFactory类只提供一个全局功能入口点,我们也可以仅仅把所有方法设为静态的,但前者更有导向性。 首先,create()方法返回java.rmi.Remote的一个实例,大多数业务对象实现上有选择,也就是RMI,EJB以关于基于xml的远程调用(JAX-RPC)的API,需要一个远程接口。简单的基于JavaBean的业务对象的实现,客户端代码时刻需要捕获java.rmi.RemoteException异常,这就带来了些不便。但是,这种不便提供了实现上的透明性,也就是不改变客户端代码就可以使业务对象能被改换成不同的方法来实现,唯一的约束就是远程就口不能被改变。create()方法的另一特性就是他的参数类型,java.lang.Class,这符合远程接口类型,用它可以使得BusinessObjectFactory类轻松的被加到应用程序里。这并不阻碍XYZ使用创建的适配类来简化客户端程序:
public class XyzBusinessObjectFactory { // Reference to singleton used for brevity, not required! private BusinessObjectFactory bof = BusinessObjectFactory.getInstance();
public abstract class BusinessObjectFactoryDelegate { protected abstract Remote doCreate(); public final void setBusinessInterface( Class businessInterface ); public final Class getBusinessInterface(); } 类BusinessObjectFactory实例创建一个实现了远程业务接口的业务对象实例,并被businessInterface属性重新描述。你可以尝尝实现BusinessObjectFactoryDelegate的不同滋味,每种都会描述其他一些业务 对象的实现途径,例如JavaBeans, RMI, EJB, or JAX-RPC.稍后我会举些例子。还需要注意客户端代码并不需要暴露给任何BusinessObjectFactoryDelegate实例,我们将会看见BusinessObjectFactory类可以内在地关注所有的委托,这并不是该框架唯一隐藏的特性。
InvocationDecorator接口 客户端代码有时候会使用业务对象框架的另一格式,即使它对此并不了解。InvocationDecorator接口代码如下: public interface InvocationDecorator { public Object decorate( Method method, Object[] args, InvocationDecoratorChain chain ) throws Throwable; } InvocationDecorator实例有机会截取每个方法的映射并加以修饰,一些潜在的修饰操作,比如:日志,事务处理及授权。每一个InvocationDecorator实例可以执行一些操作,并作为一个参数传递给InvocationDecoratorChain的实例。如下: public interface InvocationDecoratorChain { public Object decorate( Method method, Object[] args ) throws Throwable; }