摘要: 現今大多項目從小型開始發展并成為大型的可升級的體系結構,但是,當體系改變時,相應的商業邏輯實現也要改變。用戶接口可能不需要改變,但是為了可測量,商業邏輯必須從單純的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; }