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

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

J2EE中幾種業務代理模式的實現和比較

2019-11-18 11:10:00
字體:
來源:轉載
供稿:網友

一、業務代理模式(buiness PRoxy)

在J2EE系統中,一般劃分為表現層和業務邏輯層,為實現表現層和業務邏輯層之間的最大限度解耦,引入業務代理模式,這樣,當表現層或業務邏輯層具體實現技術發生時,對彼此的影響很小,當然,假如希望實現完全解耦,我們可以使用消息系統JMS來實現,本文章只討論同步系統范疇。

二、工廠模式

以一個Struts+Hibernate為例,以下代碼是Struts的Action實現方法代碼:

public ActionForward update(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)throws Exception { EgForm egForm = (EgForm) form;//直接調用Hiberante實現數據持久化getUser(request).setName(egForm.getName()); return mapping.findForward(SUCCESS);}

上述update方法代碼中直接調用了后臺數據庫操作,帶來的缺點是緊密的耦合性,當更新用戶資料的需要有更多變化時,將會直接在update中加入更多業務邏輯代碼,也就是說,我們的業務邏輯層代碼已經完全依靠Struts這個表現層技術,萬一以后我們選用其它表現層技術替代Struts后,將會觸及我們業務邏輯層代碼。修改后代碼如下:

public ActionForward update(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)throws Exception{ EgForm egForm = (EgForm)form;Contact contact = new Contact();BeanUtils.copyProperties(contact, egForm); UserService userService = ServiceFactory.create(); userService.update(contact);return mapping.findForward(SUCCESS);}


上述修改后代碼中,我們將業務邏輯包裝在UserService的一個子類中實現,作為客戶端,我們使用工廠模式創建UserService對象,這樣的好處是:我們不必在update方法中耦合UserService的具體子類,也許UserService的子類是UserServiceHibernate或UserServiceEJB等。

使用工廠模式實現了表現層和業務層的解耦,這是早期很多系統的架構實現,但是這樣還是帶來很多問題,我們下面比較一下幾種實現方式。

工廠模式優缺點:首先,我們總結一下上述代碼使用了工廠模式所帶來的好處:

J2EE中幾種業務代理模式的實現和比較(圖一)

正如圖中所示,一般使用工廠模式涉及到靜態類或單態模式,如上述代碼中ServiceFactory.create()可以使用靜態或單態模式實現,從而形成客戶端單一訪問業務邏輯層入口,這樣優點有兩個:

1. 由于業務邏輯入口是單一的,客戶端對業務邏輯訪問的可控性強,例如可動態單一入口加入權限檢查或其它全局統一功能。Jive中權限正是這樣實現。可控性強。

2. 客戶端代碼簡潔,作為客戶端的表現層技術,假如我們更換了實現技術,修改的代碼很少,例如上述代碼中,假如不使用Struts更換了JSF等,只要拷貝上述兩行紅字標注的代碼。

工廠模式帶來的主要缺點是:

1. 當ServiceFactory實現子類很多時,例如除了UserService外,還有ProductService、ItemService、ImageService等等,試圖使用一個總入口來涵括這些Service會造成過多代碼耦合在一個類中,造成Facade模式濫用的后果。也就是說,使用工廠模式,擴展性不是很強。

2. 由于使用靜態或單態模式,在性能上,輕易走入單線程、單并發用戶的誤區,違反了J2EE多線程并發使用的原則。

二、Command模式

Command模式可以說解決了上面工廠模式的缺點,Command模式將所有的服務都展示給客戶端,客戶端可以通過特定命令形式直接指定調用后臺眾多Service中任何一種,Petstore中Web對EJB調用就是使用了Command模式實現。

J2EE中幾種業務代理模式的實現和比較(圖二)



Command模式雖然突破了工廠模式單一入口的缺點,但是帶來的缺點是易用性不夠,Command模式代碼實現起來不方便,這點可從Petstore繞人的WebContaoller、Event、Action等等眾多類中可以看出。

Command模式主要問題是可控性不強,假如要為所有Service動態增加類似Filter等這樣通用功能,如權限檢查等是非常不方便的。

EJB直接調用實現

我們知道,EJB是業務邏輯層實現的J2EE標準技術,EJB的session bean可以作為Service實現,例如上面在update中調用EJB的代碼如下:

public ActionForward update(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)throws Exception { EgForm egForm = (EgForm)form;Contact contact = new Contact();BeanUtils.copyProperties(contact, egForm); try{InitialContext ic = new InitialContext();UserServiceLocalHome ul =ic.lookup("UserService"); UserServiceLocal userService =ul.create();userService.update(contact); }catch(){} return mapping.findForward(SUCCESS);}



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 满洲里市| 库车县| 金华市| 方正县| 策勒县| 东平县| 饶河县| 中山市| 周至县| 崇文区| 清水河县| 沧州市| 拜泉县| 娄底市| 涡阳县| 德化县| 顺义区| 建德市| 寿阳县| 灌阳县| 辛集市| 喀喇| 江门市| 澜沧| 湖口县| 苍溪县| 玛曲县| 北辰区| 通渭县| 连山| 淅川县| 抚松县| 勃利县| 清流县| 措美县| 宜川县| 綦江县| 陈巴尔虎旗| 岑巩县| 盐源县| 祁东县|