国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

切入商業應用(一)

2019-11-18 16:25:12
字體:
來源:轉載
供稿:網友

  摘要:
   現今大多項目從小型開始發展并成為大型的可升級的體系結構,但是,當體系改變時,相應的商業邏輯實現也要改變。用戶接口可能不需要改變,但是為了可測量,商業邏輯必須從單純的javaBean實現過渡到用EnterPRise JavaBeans (EJB)來實現。如果現在的應用程序沒有被設計成適應商業邏輯實現的改變,大多數用戶的界面代碼需要更新以使用商業邏輯服務。在本篇文章,使用一個簡單的框架來訪問業務對象,你將會學到如果構架你的應用程序以使業務對象改變時不需要改變用戶接口。
By James Carman

    許多架構師努力減小在多應用中存在的表示層和業務邏輯層之間的耦合度,業務代表(Business Delegate)設計模式可以來解決這個問題,但許多評論指出這是畫蛇添足。業務代表接口模仿業務邏輯接口如此緊湊以至于任何對業務邏輯的改動都會導致業務代表接口的變動,這一話題一直有爭議。多數情況下是這樣子,但業務代表模式有它的優點,比如:遠程隱藏,錯誤恢復,線程同步和緩沖。但許多應用業務代表模式的應用程序并不利用這些額外優點,這樣就有點大才小用了。這些應用程序所需的是一種隱藏了底層實現細節的提取層,比如我們熟悉的lookup和narrow操作需要由EJB來實現。這篇文章將引領你來貫穿學習API,配置還有業務對象工廠框架的實現。
注意:你可以從此處下載本篇文章附帶的源碼Resources.

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 AccountServices createAccountServices()
  {
    return ( AccountServices )bof.create( AccountServices.class );
  }
}
    在上述代碼中,當使用BusinessObjectFactory類時類XyzBusinessObjectFactory可以包裝所需的型別轉換,使得客戶端代碼更簡潔和型別安全。
    我們要注意BusinessObjectFactory類的方法并沒有拋出直接繼承自java.lang.Exception類的異常,有問題的話會在執行時拋出運行期異常(runtime exceptions),這些問題出現在配置上而不是程序本身。由于運行期異常并不需要try/catch塊,這樣就極大的簡化了客戶端代碼,但也要根據需要允許捕獲定制的異常。在一個WEB應用里,可以在web.xml定義一個servlet過濾器或者是一個自制的錯誤提示頁面來捕獲這些異常。JDO API就采用這樣的機制。
    另外關于類BusinessObjectFactory要注意的是它被聲明為final類型,這樣使得使用抽象工廠工廠方法設計模式在隱藏實現框架中變得更為典型,例如DAO(Data access Object)設計模式。但如你所見,業務對象框架的擴展性并不由子集而是需要委托來實現。

類BusinessObjectFactoryDelegate
    類BusinessObjectFactory產生BusinessObjectFactoryDelegate的一個實例作為委托代表:

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;
}

    InvocationDecoratorChain的對象持有經排序過的InvocationDecorator的實例,并最終調用相關的業務對象所需的方法。對于那些熟悉JAVA servlet API的來說,這就像是servlet2.3規范中的servlet過濾器。實際上該思想也是借鑒于此規范,當我設計該框架某部分時得到的一個念頭。為什么不用AOP(aspect-oriented programming)和AspectJ來修飾每個映射呢?因為,改變你的代碼的話AOP需要重新編譯,而InvocationDecorator實例在InvocationDecoratorChain里增加或刪除的話只需要改一下配置文件就可以了。

matrix開源技術經javaworld授權翻譯并發布.
如果你對此文章有任何看法或建議,請到Matrix論壇發表您的意見.
注明: 如果對matrix的翻譯文章系列感興趣,請點擊oreilly和javaworld文章翻譯計劃查看詳細情況
您也可以點擊-javenmen查看翻譯作者的詳細信息.進入討論組討論。

(出處:http://m.survivalescaperooms.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 山东省| 伽师县| 富蕴县| 永福县| 堆龙德庆县| 固原市| 乐平市| 岳池县| 三穗县| 隆德县| 马边| 双峰县| 唐河县| 天镇县| 西峡县| 公主岭市| 滁州市| 隆林| 新邵县| 元谋县| 阿拉善左旗| 会宁县| 霍邱县| 和平县| 玛纳斯县| 兴隆县| 石林| 曲阳县| 朝阳县| 漳平市| 神木县| 罗城| 湖南省| 乌兰察布市| 汤阴县| 徐汇区| 来宾市| 雷山县| 万源市| 临清市| 云安县|