



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、描述:讓我們思考一下下面的代碼:/Client1.class Customer2.publicvoidsomeMethod()3./CreatetheServiceProviderInstance4.FileUtilfutilObj=newFileUtil();5./AccesstheService6.futilObj.writeToFile(“Some Data”);7. 8. 作為它實現(xiàn)的一部分, Customer 類創(chuàng)建了一個 FileUtil 類的一個實例并且直接訪問它的服務。換句話說,對于客戶對象,訪問 FileUtil 對象的方式是很直接的。它的實現(xiàn)可能是客戶對象訪問服務提供者對象
2、最為普通的方式了。相比較,有些時候客戶對象可能不直接訪問服務提供者(也就是指目標對象),這種情況是由于下面的原因導致的:( 1)目標對象的位置 ?目標對象可能存在于同一臺或者不同機器的不同地址空間。( 2)目標對象的存在形式 ?目標對象可能直到他被請求服務的時候還不存在,或者對象被壓縮。( 3)特殊的行為 ?目標對象可以根據(jù)客戶對象的訪問權限接受或拒絕服務。在多線程環(huán)境,一些服務提供者對象需要特殊的考慮。在這些情況下, 代理模式(Proxy Pattern )建議不要使有特殊需求的客戶對象直接訪問目標對象,而是使用一個單獨的(分離的)對象(也就是指代理對象)為不同的客戶提供通常的、直接的訪問目
3、標對象的方式。代理對象提供和目標對象一樣的接口。 代理對象負責與目標對象交互的細節(jié),代表客戶對象與目標對象交互。 所以客戶對象不再需要處理訪問目標對象的服務時的特殊需求。 客戶對象通過它的接口調用代理對象, 代理對象直接把這些調用依次地傳遞給目標對象。 客戶對象不需要知道代理的原對象 (目標對象)。代理對象隱藏了與客戶對象進行交互的對象細節(jié), 如:對象是否是遠程的、 是否初始化、是否需要特殊的權限等。 換句話說,代理對象作為客戶和不可訪問的遠程對象或推遲初始化對象之間的透明橋梁。代理對象因使用的場景不同, 代理的種類也不同。 讓我們來快速的瀏覽一下一些代理和它們的目標。注意:表 23.1 列出
4、了不同種類的代理對象,在一章中,僅討論遠程代理,其他的一些代理會在本書后面的模式中討論。Table23.1:ListofDifferentProxyTypes代理類型目的遠程代理提供對在不同地址空間的遠程對象的訪問緩存代理/ 服務代理為了提供能夠保存目標操作經常用到的結果,代理對象以存儲方式保存這些結果。 當客戶對象請求同一個操作時, 代理不需要直接訪問目標對象,而是從存貯介質返回操作結果。防火墻代理 使用防火墻代理主要是為了保護目標對象以防止有害客戶的訪問。同時也可以防止客戶訪問有害的目標對象。保護代理提供了不同客戶訪問不同層次的目標對象的功能。在創(chuàng)建代理時, 定義了一個權限的集合。 雖后,
5、這些權限用來限制訪問代理的特定部分,如果沒有執(zhí)行方法的權限,客戶對象不允許訪問特定的方法。同步代理提供了允許不同的客戶對象安全的同步訪問目標對象的功能。計數(shù)代理在執(zhí)行目標對象的方法前,提供了一些審計機制。代理模式和其他模式從討論不同的代理對象中可以看出:代理對象有兩個主要的特征:( 1)它介于客戶對象和目標對象之間。( 2)它接受客戶對象的調用,然后轉發(fā)調用給目標對象。在這種情形下, 看上去和本書中前面討論的其他模式有些相似。 讓我們討論一下代理模式和一些與它相似的模式之間的相同點和不同點。代理模式和裝飾模式:代理模式:( 1)客戶對象不能直接訪問目標對象( 2)代理對象提供了對目標對象的訪問
6、控制(在保護代理中)( 3)代理對象不能再增加其他的功能。裝飾模式:( 1)如果需要,客戶對象不能直接訪問目標對象。( 2)裝飾對象不能控制對目標對象的訪問。( 3)裝飾對象可以增加額外的功能。代理模式和外觀模式:代理模式:( 1)代理對象代表一個單一對象。( 2)客戶對象不能直接訪問目標對象。( 3)代理對象提供了對于單一目標對象的訪問控制。外觀模式:( 1)外觀對象代表了對象的一個子系統(tǒng)。( 2)如果必要,客戶對象可以直接訪問子系統(tǒng)中的對象。( 3)一個外觀對象提供了一個對子系統(tǒng)組件的簡單的、高層次的接口 .代理模式和責任鏈模式:代理模式:( 1)代理對象代表了一個單一的對象。( 2)克輝
7、請求首先被代理對象所接受,但是不直接被代理對象處理。( 3)客戶請求總是被傳遞給目標對象。( 4)假設客戶與服務器正常工作,可以保證請求會得到響應,責任鏈模式:( 1)責任鏈包括很多對象。( 2)接受客戶請求的對象首先處理請求。( 3)近當現(xiàn)在的接收者不能處理請求時,客戶請求才被傳遞給下一個對象。( 4)不能保證請求會得到響應。也就是請求已經到達責任鏈尾,擔仍然沒有被處理。在 Java 中,遠程方法調用( RMI)充分的利用了遠程代理模式,讓我們快速的瀏覽一下遠程方法調用 (RMI)的概念和遠程方法調用 (RMI)通信過程應用的組件。RMI:快速瀏覽RMI使客戶對象像訪問本地對象一樣訪問遠程對
8、象并調用其方法成為可能。(如圖 23.1 )Figure 23.1: Client s View of Its Communication with a Remo te Object Using RMI下面是為實現(xiàn) RMI 功能而一起協(xié)作的不同組件。( 1) 遠程接口(Remote Interface )?一個遠程對象必須實現(xiàn)一個遠程接口(這個接口擴展 java.rmi.Remote )。遠程接口聲明可以被客戶訪問的遠程對象的方法。換句話說,遠程接口可以看成遠程對象對客戶的視圖。需求(要求):1)擴展 java.rmi.Remote2) 在遠程接口中定義的所有方法必須聲明拋出 java.rmi
9、.RemoteException 異常。( 2)遠程對象( Remote Object )?遠程對象負責實現(xiàn)在遠程接口中定義的方法。需求(要求):1)必須提供遠程接口的實現(xiàn)。2)必須擴展 java.rmi.server.UnicastRemoteObject類。3)必須有一個沒有參數(shù)的構造函數(shù)。4)必須與一個服務器相關聯(lián)。通過調用零參數(shù)的構造函數(shù),服務器創(chuàng)建遠程對象的一個實例。( 3) RMI注冊表( RMI Registry )?RMI注冊表提供了保持不同遠程對象的地址空間。1) 遠程對象需要存儲在一個客戶可以通過命名引用 (Name reference )來訪問它的 RMI 注冊表中。2)
10、一個給定的命名引用僅可以存儲一個對象。( 4)客戶( Client )?客戶是一個試圖訪問遠程對象的應用程序。1)必須可以感知被遠程對象實現(xiàn)的接口。2)通過命名引用 (Name reference )在 RMI注冊表中可以查到遠程對象。一旦查到遠程對象的引用,調用這個引用上的方法。( 5) RMIC (Java RMI樁編譯器 )Java RMI stub compiler? 一旦遠程對象編譯成功, RMIC(JavaRMI 樁編譯器)可以生成遠程對象的樁類文件 (stub)和框架類文件 (skeleton)。樁類文件 (stub) 和框架類文件 (skeleton) 從編譯的遠程對象類中產生
11、。這些樁類文件 (stub) 和框架類文件 (skeleton)使客戶對象以無縫的方式訪問遠程對象成為可能。下面這部分描述客戶對象和遠程對象如何通信。RMI通信機制:一般地,客戶對象不能按通常方式直接訪問遠程對象。 為了使客戶對象像訪問本地對象一樣訪問遠程對象的服務, RMIC(Java RMI 樁編譯器)生成的遠程對象的樁文件 (stub) 和遠程接口需要拷貝到客戶機器上。樁文件 (stub) 負責扮演著遠程對象的 (遠程)代理的角色, 負責把方法的調用傳遞給真實的遠程對象實現(xiàn)所在的遠程服務器上。 任何時候,客戶對象引用遠程對象, 這個引用實際上是遠程對象的本地樁文件。 也就是,當客戶調用遠
12、程對象上的方法時, 調用首先被本地樁實例所接受, 樁再將這個調用傳遞到遠程服務器上。在服務器端, RMIC產生的遠程對象的框架文件 (skeleton) 接受這個調用。框架文件 (skeleton) 在服務器端,不需要拷貝到客戶機器上。 框架文件 (skeleton) 負責將這些調用轉發(fā)到真正的遠程對象的實現(xiàn)上。 一旦遠程對象執(zhí)行了方法,方法返回的結果將按照反方向返回給客戶。圖 23.2 說明了 RMI 通信的過程Figure 23.2: The Actual RMI Communication Process 了解更多的關于 Java RMI的知識,推薦閱讀 RMI tutorialRMI和
13、遠程代理模式:從 RMI 通信的討論中,可以看到樁類文件扮演著遠程對象的遠程代理的角色。它使得客戶訪問遠程對象就像訪問本地對象一樣成為可能。 因此,一些使用了 RMI 技術的應用就已經暗含著代理模式的實現(xiàn)。例子:在討論外觀模式時,我們建立了一個簡單的客戶數(shù)據(jù)管理應用來驗證和保存輸入的客戶數(shù)據(jù)。我們的設計由分別代表不同客戶數(shù)據(jù)的三個類組成。在應用外觀模式以前, 客戶 AccountManager 可以直接與子系統(tǒng)的三個用來驗證、保存客戶數(shù)據(jù)的類交互。應用外觀模式,我們定義了一個 CustomFacade外觀對象代表客戶與三個子系統(tǒng)類交互(如圖 23.3 )。Figure23.3:Customer
14、DataManagement ApplicationfortheLocalMode ofOperation?ClassAssociation在這個應用中,子系統(tǒng)組件和外觀對象對于客戶對象AccountManager 都是本地的。現(xiàn)在,讓我們建立這個應用的不同版本,這個版本已遠程的方式運行。在遠程方式下,這個應用通過運用JAVA RMI技術,訪問遠程對象。在使應用運行在遠程操作模式下的設計中,我們要把子系統(tǒng)組件(Account 、Address 和 CreditCard )和外觀( CustomerFacade)移到遠程服務器上。這樣會帶來以下好處:1) 在服務器上的對象可以被不同的客戶應用所共
15、享??蛻舨辉傩枰S護這些類的本地版本,因此,成為輕型客戶端( light-weighted )。2)可以對變化、性能和監(jiān)控進行統(tǒng)一的集中控制。Figure 23.4:Customer DataManagement Applicationfor the RemoteMode ofOperation?ClassAssociation讓我們開始運用 RMI技術設計遠程操作模式下的客戶數(shù)據(jù)管理應用。第一步,先定義遠程接口 CustomerIntr :這個借口要滿足:1)聲明外觀實現(xiàn)的方法。2)所有的方法聲明拋出 RemoteException 異常。3)擴展 java.rmi.Remote接口。1.p
16、ublicinterfaceCustomerIntrextends java.rmi.2.voidsetAddress(inAddress)throwsRemoteException;3.voidsetCity(inCity)throwsRemoteException;4.voidsetState(inState)throwsRemoteException ;5.voidsetFName(inFName)throwsRemoteException ;6.voidsetLName(inLName)throwsRemoteException ;7.voidsetCardType( inCardTy
17、pe)throwsRemoteException;8. void setCardNumber( inCardNumber)9.throwsRemoteException ;10. void setCardExpDate( inCardExpDate)11.throwsRemoteException ;12. boolean saveCustomerData() throws RemoteException ;13.讓我們重新定義 CustomerFacade 外觀類,因為它要實現(xiàn) CustomerIntr遠程接口。不同的客戶對象通過CustomerIntr 接口在具體類 CustomerFac
18、ade上的實現(xiàn)與子系統(tǒng)對象進行交互。 圖 23.5展示了 CustomerFacade 和它實現(xiàn)的遠程接口 CustomerIntr之間的結構和關聯(lián)。Listing23.1:CustomerFacade Class?Revised1.publicclassCustomerFacadeextendsUnicastRemoteObject2.implementsCustomerIntr3.privateaddress;4.privatecity;5.privatestate;6.privatecardType;7.privatecardNumber;8.privatecardExpDate;9.p
19、rivatefname;10.privatelname;11.publicCustomerFacade()throwsRemoteException 12.super ();13.out.println(Serverobjectcreated );14. 15.publicstaticvoid main( args)throws16.port =1099 ;17.host=localhost;18./Checkforhostname argument19.if(args.length=1)20.host=args0;21.22.if(args.length=2)23.port=args1;24
20、.25.if(.getSecurityManager()=null )26.setSecurityManager(newRMISecurityManager ();27.28./Createan instanceoftheserver29.CustomerFacadefacade=newCustomerFacade();30./BinditwiththeRMIRegistry31.Naming.bind(/+ host+ :+port + /CustomerFacade”,32.facade);33.out.println(ServiceBound );34. 35.publicvoidset
21、Address(inAddress)36.throwsRemoteException37.address= inAddress;38. 39.publicvoidsetCity(inCity)40.throwsRemoteException city= inCity;41. 42.publicvoidsetState(inState)43.throwsRemoteException state = inState;44. 45. public void setFName( inFName)46.throwsRemoteException fname=inFName;47. 48. public
22、 void setLName( inLName)49.throwsRemoteException lname=inLName;50. 51.publicvoidsetCardType(inCardType)52.throwsRemoteException53.cardType= inCardType;54. 55. public void setCardNumber( inCardNumber)56.throwsRemoteException57.cardNumber=inCardNumber;58. 59. public void setCardExpDate( inCardExpDate)
23、60.throwsRemoteException61.cardExpDate=inCardExpDate;62. 63.publicbooleansaveCustomerData()throwsRemoteException64.AddressobjAddress;65.AccountobjAccount;66.CreditCardobjCreditCard;67./*68.clientistransparentfromthefollowing69.set ofsubsystemrelatedoperations.70.*/71.booleanvalidData=true ;72.errorM
24、essage= ;73.objAccount=newAccount(fname,lname);74.if(objAccount.isValid()=false)75.validData=false;76.errorMessage=InvalidFirstName/LastName ;77.78.objAddress=newAddress(address,city,state);79.if(objAddress.isValid()=false)80.validData=false;81.errorMessage=InvalidAddress/City/State;82.83.objCreditC
25、ard=newCreditCard(cardType,cardNumber,84.cardExpDate);85.if(objCreditCard.isValid()= false)86.validData=false;87.errorMessage=InvalidCreditCardInfo;88.89.if(!validData)90.out.println(errorMessage);91.returnfalse;92.93.if(objAddress.save()&objAccount.save()&94.objCreditCard.save()95.returntrue ;96.el
26、se97.returnfalse;98.99. 100. Figure23.5:Fa?adeDesign?RemoteMode ofOperation因為子系統(tǒng)組件對于 CustomerFacade 類是本地的,子系統(tǒng)組件初始化、方法調用的方式上沒有任何變化,子系統(tǒng)組件對于 CustomerFacade 類仍然是本地對象。當執(zhí)行的時候, CustomerFacade自己創(chuàng)建一個實例并把引用名稱( reference name)保存在 RMI注冊表中??蛻魧ο笸ㄟ^引用名稱能取得遠程對象的一個拷貝。因為客戶不需要直接訪問任何的子系統(tǒng)組件。 所以在遠程操作模式下的設計中,不需要對子系統(tǒng)的任何組件進行
27、任何的修改。讓我們重新設計客戶類 AccountManager:Listing23.2:AccountManagerClass?Revised1.2.3.publicvoidactionPerformed( ActionEvent e)4.5.6.if(e.getActionCommand().equals(7.AccountManager.VALIDATE_SAVE)8./getinputvalues9.firstName= objAccountManager.getFirstName();10.lastName=objAccountManager.getLastName();11.addr
28、ess=objAccountManager.getAddress();12.13.14.try15./CallregistryforAddOperation16.facade=(CustomerIntr)Naming.lookup( rmi:/+17.objAccountManager.getRMIHost()+:+18.objAccountManager.getRMIPort()+19./CustomerFacade );20.facade.setFName(firstName);21.facade.setLName(lastName);22.facade.setAddress(addres
29、s);23.24.25./Clientisnotrequiredtoaccesssubsystemcomponents.26.booleanresult= facade.saveCustomerData();27.if(result)28.validateCheckResult=29.ValidCustomerData:DataSavedSuccessfully ;30.else31.validateCheckResult=32.InvalidCustomerData:DataCouldNotBeSaved ;33.34.catch(ex)35.out.println(36.Error:Pleasechecktoensurethe +37.remoteserverisrunning+38.ex.getMessage();39.40.objAccountManager.setResultDisplay(41.validateChe
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 受教育權案例分析
- 腎衰竭護理疑難病例討論
- 中班健康教育課件《我不怕感冒》
- 軸承裝備智能檢測技術-洞察及研究
- 中班健康回家的路課件
- 二零二五年度YXJS04模具實訓設備采購與市場調研報告合同
- 2025版10KV配電安裝工程可再生能源并網合同
- 2025年度地產廣告VI視覺形象設計合同范本
- 2025年度9A級文建筑智能化系統(tǒng)施工合作協(xié)議
- 2025版企業(yè)員工試用期間勞動合同解除后離職手續(xù)辦理規(guī)范
- 裝飾裝修工程-工程施工設計方案
- 記憶原理及方法課件
- 頸脊髓損傷 -課件
- 老年俱樂部建設項目可行性研究報告
- 國外不規(guī)則氣象報文課件
- 杭州網約車從業(yè)資格考試題庫與答案
- 格力好易控集中控制器使用說明
- 巨光Y型空氣消毒器
- 食品安全管理制度(個體戶、一般企業(yè))
- 工商銀行招聘考試全新試題(完整版)(答案)
- 某x司建設項目總體部署編制管理規(guī)定
評論
0/150
提交評論