




已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
描述:讓我們思考一下下面的代碼:/Client1. classCustomer 2. publicvoidsomeMethod() 3. /CreatetheServiceProviderInstance 4. FileUtilfutilObj=newFileUtil(); 5. /AccesstheService 6. futilObj.writeToFile(“SomeData”); 7. 8. 作為它實現(xiàn)的一部分,Customer類創(chuàng)建了一個FileUtil類的一個實例并且直接訪問它的服務(wù)。換句話說,對于客戶對象,訪問FileUtil對象的方式是很直接的。它的實現(xiàn)可能是客戶對象訪問服務(wù)提供者對象最為普通的方式了。相比較,有些時候客戶對象可能不直接訪問服務(wù)提供者(也就是指目標對象),這種情況是由于下面的原因?qū)е碌模海?)目標對象的位置?目標對象可能存在于同一臺或者不同機器的不同地址空間。(2)目標對象的存在形式?目標對象可能直到他被請求服務(wù)的時候還不存在,或者對象被壓縮。(3)特殊的行為?目標對象可以根據(jù)客戶對象的訪問權(quán)限接受或拒絕服務(wù)。在多線程環(huán)境,一些服務(wù)提供者對象需要特殊的考慮。在這些情況下,代理模式(ProxyPattern)建議不要使有特殊需求的客戶對象直接訪問目標對象,而是使用一個單獨的(分離的)對象(也就是指代理對象)為不同的客戶提供通常的、直接的訪問目標對象的方式。代理對象提供和目標對象一樣的接口。代理對象負責與目標對象交互的細節(jié),代表客戶對象與目標對象交互。所以客戶對象不再需要處理訪問目標對象的服務(wù)時的特殊需求??蛻魧ο笸ㄟ^它的接口調(diào)用代理對象,代理對象直接把這些調(diào)用依次地傳遞給目標對象??蛻魧ο蟛恍枰来淼脑瓕ο螅繕藢ο螅4韺ο箅[藏了與客戶對象進行交互的對象細節(jié),如:對象是否是遠程的、是否初始化、是否需要特殊的權(quán)限等。換句話說,代理對象作為客戶和不可訪問的遠程對象或推遲初始化對象之間的透明橋梁。代理對象因使用的場景不同,代理的種類也不同。讓我們來快速的瀏覽一下一些代理和它們的目標。注意:表23.1列出了不同種類的代理對象,在一章中,僅討論遠程代理,其他的一些代理會在本書后面的模式中討論。Table23.1:ListofDifferentProxyTypes代理類型目的遠程代理提供對在不同地址空間的遠程對象的訪問緩存代理/服務(wù)代理為了提供能夠保存目標操作經(jīng)常用到的結(jié)果,代理對象以存儲方式保存這些結(jié)果。當客戶對象請求同一個操作時,代理不需要直接訪問目標對象,而是從存貯介質(zhì)返回操作結(jié)果。防火墻代理使用防火墻代理主要是為了保護目標對象以防止有害客戶的訪問。同時也可以防止客戶訪問有害的目標對象。保護代理提供了不同客戶訪問不同層次的目標對象的功能。在創(chuàng)建代理時,定義了一個權(quán)限的集合。雖后,這些權(quán)限用來限制訪問代理的特定部分,如果沒有執(zhí)行方法的權(quán)限,客戶對象不允許訪問特定的方法。同步代理提供了允許不同的客戶對象安全的同步訪問目標對象的功能。計數(shù)代理在執(zhí)行目標對象的方法前,提供了一些審計機制。代理模式和其他模式從討論不同的代理對象中可以看出:代理對象有兩個主要的特征:(1)它介于客戶對象和目標對象之間。(2)它接受客戶對象的調(diào)用,然后轉(zhuǎn)發(fā)調(diào)用給目標對象。在這種情形下,看上去和本書中前面討論的其他模式有些相似。讓我們討論一下代理模式和一些與它相似的模式之間的相同點和不同點。代理模式和裝飾模式:代理模式:(1)客戶對象不能直接訪問目標對象(2)代理對象提供了對目標對象的訪問控制(在保護代理中)(3)代理對象不能再增加其他的功能。裝飾模式:(1)如果需要,客戶對象不能直接訪問目標對象。(2)裝飾對象不能控制對目標對象的訪問。(3)裝飾對象可以增加額外的功能。代理模式和外觀模式:代理模式:(1)代理對象代表一個單一對象。(2)客戶對象不能直接訪問目標對象。(3)代理對象提供了對于單一目標對象的訪問控制。外觀模式:(1)外觀對象代表了對象的一個子系統(tǒng)。(2)如果必要,客戶對象可以直接訪問子系統(tǒng)中的對象。(3)一個外觀對象提供了一個對子系統(tǒng)組件的簡單的、高層次的接口.代理模式和責任鏈模式:代理模式:(1)代理對象代表了一個單一的對象。(2)克輝請求首先被代理對象所接受,但是不直接被代理對象處理。(3)客戶請求總是被傳遞給目標對象。(4)假設(shè)客戶與服務(wù)器正常工作,可以保證請求會得到響應,責任鏈模式:(1)責任鏈包括很多對象。(2)接受客戶請求的對象首先處理請求。(3)近當現(xiàn)在的接收者不能處理請求時,客戶請求才被傳遞給下一個對象。(4)不能保證請求會得到響應。也就是請求已經(jīng)到達責任鏈尾,擔仍然沒有被處理。在Java中,遠程方法調(diào)用(RMI)充分的利用了遠程代理模式,讓我們快速的瀏覽一下遠程方法調(diào)用(RMI)的概念和遠程方法調(diào)用(RMI)通信過程應用的組件。RMI:快速瀏覽RMI使客戶對象像訪問本地對象一樣訪問遠程對象并調(diào)用其方法成為可能。(如圖23.1)Figure23.1:ClientsViewofItsCommunicationwithaRemoteObjectUsingRMI下面是為實現(xiàn)RMI功能而一起協(xié)作的不同組件。(1)遠程接口(RemoteInterface)?一個遠程對象必須實現(xiàn)一個遠程接口(這個接口擴展java.rmi.Remote)。遠程接口聲明可以被客戶訪問的遠程對象的方法。換句話說,遠程接口可以看成遠程對象對客戶的視圖。需求(要求):1)擴展java.rmi.Remote2)在遠程接口中定義的所有方法必須聲明拋出java.rmi.RemoteException異常。(2)遠程對象(RemoteObject)?遠程對象負責實現(xiàn)在遠程接口中定義的方法。需求(要求):1)必須提供遠程接口的實現(xiàn)。2)必須擴展java.rmi.server.UnicastRemoteObject類。3)必須有一個沒有參數(shù)的構(gòu)造函數(shù)。4)必須與一個服務(wù)器相關(guān)聯(lián)。通過調(diào)用零參數(shù)的構(gòu)造函數(shù),服務(wù)器創(chuàng)建遠程對象的一個實例。(3)RMI注冊表(RMIRegistry)?RMI注冊表提供了保持不同遠程對象的地址空間。1)遠程對象需要存儲在一個客戶可以通過命名引用(Namereference)來訪問它的RMI注冊表中。2)一個給定的命名引用僅可以存儲一個對象。(4)客戶(Client)?客戶是一個試圖訪問遠程對象的應用程序。1)必須可以感知被遠程對象實現(xiàn)的接口。2)通過命名引用(Namereference)在RMI注冊表中可以查到遠程對象。一旦查到遠程對象的引用,調(diào)用這個引用上的方法。(5)RMIC(JavaRMI樁編譯器)JavaRMIstubcompiler?一旦遠程對象編譯成功,RMIC(JavaRMI樁編譯器)可以生成遠程對象的樁類文件(stub)和框架類文件(skeleton)。樁類文件(stub)和框架類文件(skeleton)從編譯的遠程對象類中產(chǎn)生。這些樁類文件(stub)和框架類文件(skeleton)使客戶對象以無縫的方式訪問遠程對象成為可能。下面這部分描述客戶對象和遠程對象如何通信。RMI通信機制:一般地,客戶對象不能按通常方式直接訪問遠程對象。為了使客戶對象像訪問本地對象一樣訪問遠程對象的服務(wù),RMIC(JavaRMI樁編譯器)生成的遠程對象的樁文件(stub)和遠程接口需要拷貝到客戶機器上。樁文件(stub)負責扮演著遠程對象的(遠程)代理的角色,負責把方法的調(diào)用傳遞給真實的遠程對象實現(xiàn)所在的遠程服務(wù)器上。任何時候,客戶對象引用遠程對象,這個引用實際上是遠程對象的本地樁文件。也就是,當客戶調(diào)用遠程對象上的方法時,調(diào)用首先被本地樁實例所接受,樁再將這個調(diào)用傳遞到遠程服務(wù)器上。在服務(wù)器端,RMIC產(chǎn)生的遠程對象的框架文件(skeleton)接受這個調(diào)用??蚣芪募?skeleton)在服務(wù)器端,不需要拷貝到客戶機器上??蚣芪募?skeleton)負責將這些調(diào)用轉(zhuǎn)發(fā)到真正的遠程對象的實現(xiàn)上。一旦遠程對象執(zhí)行了方法,方法返回的結(jié)果將按照反方向返回給客戶。圖23.2說明了RMI通信的過程Figure23.2:TheActualRMICommunicationProcess了解更多的關(guān)于JavaRMI的知識,推薦閱讀RMItutorialRMI和遠程代理模式:從RMI通信的討論中,可以看到樁類文件扮演著遠程對象的遠程代理的角色。它使得客戶訪問遠程對象就像訪問本地對象一樣成為可能。因此,一些使用了RMI技術(shù)的應用就已經(jīng)暗含著代理模式的實現(xiàn)。例子:在討論外觀模式時,我們建立了一個簡單的客戶數(shù)據(jù)管理應用來驗證和保存輸入的客戶數(shù)據(jù)。我們的設(shè)計由分別代表不同客戶數(shù)據(jù)的三個類組成。在應用外觀模式以前,客戶AccountManager可以直接與子系統(tǒng)的三個用來驗證、保存客戶數(shù)據(jù)的類交互。應用外觀模式,我們定義了一個CustomFacade外觀對象代表客戶與三個子系統(tǒng)類交互(如圖23.3)。Figure23.3:CustomerDataManagementApplicationfortheLocalModeofOperation?ClassAssociation在這個應用中,子系統(tǒng)組件和外觀對象對于客戶對象AccountManager都是本地的?,F(xiàn)在,讓我們建立這個應用的不同版本,這個版本已遠程的方式運行。在遠程方式下,這個應用通過運用JAVARMI技術(shù),訪問遠程對象。在使應用運行在遠程操作模式下的設(shè)計中,我們要把子系統(tǒng)組件(Account、Address和CreditCard)和外觀(CustomerFacade)移到遠程服務(wù)器上。這樣會帶來以下好處:1)在服務(wù)器上的對象可以被不同的客戶應用所共享。客戶不再需要維護這些類的本地版本,因此,成為輕型客戶端(light-weighted)。2)可以對變化、性能和監(jiān)控進行統(tǒng)一的集中控制。Figure23.4:CustomerDataManagementApplicationfortheRemoteModeofOperation?ClassAssociation讓我們開始運用RMI技術(shù)設(shè)計遠程操作模式下的客戶數(shù)據(jù)管理應用。第一步,先定義遠程接口CustomerIntr:這個借口要滿足:1)聲明外觀實現(xiàn)的方法。2)所有的方法聲明拋出RemoteException異常。3)擴展java.rmi.Remote接口。1. publicinterfaceCustomerIntrextendsjava.rmi. 2. voidsetAddress(inAddress)throwsRemoteException; 3. voidsetCity(inCity)throwsRemoteException; 4. voidsetState(inState)throwsRemoteException; 5. voidsetFName(inFName)throwsRemoteException; 6. voidsetLName(inLName)throwsRemoteException; 7. voidsetCardType(inCardType)throwsRemoteException; 8. voidsetCardNumber(inCardNumber) 9. throwsRemoteException; 10. voidsetCardExpDate(inCardExpDate) 11. throwsRemoteException; 12. booleansaveCustomerData()throwsRemoteException; 13. 讓我們重新定義CustomerFacade外觀類,因為它要實現(xiàn)CustomerIntr遠程接口。不同的客戶對象通過CustomerIntr接口在具體類CustomerFacade上的實現(xiàn)與子系統(tǒng)對象進行交互。圖23.5展示了CustomerFacade和它實現(xiàn)的遠程接口CustomerIntr之間的結(jié)構(gòu)和關(guān)聯(lián)。Listing23.1:CustomerFacadeClass?Revised1. publicclassCustomerFacadeextendsUnicastRemoteObject 2. implementsCustomerIntr 3. privateaddress; 4. privatecity; 5. privatestate; 6. privatecardType; 7. privatecardNumber; 8. privatecardExpDate; 9. privatefname; 10. privatelname; 11. publicCustomerFacade()throwsRemoteException 12. super(); 13. .out.println(Serverobjectcreated); 14. 15. publicstaticvoidmain( args)throws 16. port=1099; 17. host=localhost; 18. /Checkforhostnameargument 19. if(args.length=1) 20. host=args0; 21. 22. if(args.length=2) 23. port=args1; 24. 25. if(.getSecurityManager()=null) 26. .setSecurityManager(newRMISecurityManager(); 27. 28. /Createaninstanceoftheserver 29. CustomerFacadefacade=newCustomerFacade(); 30. /BinditwiththeRMIRegistry 31. Naming.bind(/+host+:+port+/CustomerFacade”, 32. facade); 33. .out.println(ServiceBound); 34. 35. publicvoidsetAddress(inAddress) 36. throwsRemoteException 37. address=inAddress; 38. 39. publicvoidsetCity(inCity) 40. throwsRemoteExceptioncity=inCity; 41. 42. publicvoidsetState(inState) 43. throwsRemoteExceptionstate=inState; 44. 45. publicvoidsetFName(inFName) 46. throwsRemoteExceptionfname=inFName; 47. 48. publicvoidsetLName(inLName) 49. throwsRemoteExceptionlname=inLName; 50. 51. publicvoidsetCardType(inCardType) 52. throwsRemoteException 53. cardType=inCardType; 54. 55. publicvoidsetCardNumber(inCardNumber) 56. throwsRemoteException 57. cardNumber=inCardNumber; 58. 59. publicvoidsetCardExpDate(inCardExpDate) 60. throwsRemoteException 61. cardExpDate=inCardExpDate; 62. 63. publicbooleansaveCustomerData()throwsRemoteException 64. AddressobjAddress; 65. AccountobjAccount; 66. CreditCardobjCreditCard; 67. /* 68. clientistransparentfromthefollowing 69. setofsubsystemrelatedoperations. 70. */ 71. booleanvalidData=true; 72. errorMessage=; 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. objCreditCard=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. else 97. returnfalse; 98. 99. 100. Figure23.5:FaadeDesign?RemoteModeofOperation因為子系統(tǒng)組件對于CustomerFacade類是本地的,子系統(tǒng)組件初始化、方法調(diào)用的方式上沒有任何變化,子系統(tǒng)組件對于CustomerFacade類仍然是本地對象。當執(zhí)行的時候,CustomerFacade自己創(chuàng)建一個實例并把引用名稱(referencename)保存在RMI注冊表中??蛻魧ο笸ㄟ^引用名稱能取得遠程對象的一個拷貝。因為客戶不需要直接訪問任何的子系統(tǒng)組件。所以在遠程操作模式下的設(shè)計中,不需要對子系統(tǒng)的任何組件進行任何的修改。讓我們重新設(shè)計客戶類AccountManager:Listing23.2:AccountManagerClass?Revised 1. 2. 3. publicvoidactionPerformed(ActionEvente) 4. 5. 6. if(e.getActionCommand().equals( 7. AccountManager.VALIDATE_SAVE) 8. /getinputvalues 9. firstName=objAccountManager.getFirstName(); 10. lastName=objAccountManager.getLastName(); 11. address=objAccountManager.getAddress(); 12. 13. 14. try 15. /CallregistryforAddOperation 16. facade=(CustomerIntr)Naming.lookup(rmi:/+ 17. objAccountManager.getRMIHost()+:+ 18. objAccountManager.getRMIPort()+ 19. /CustomerFacade); 20. facade.setFName(firstName); 21. facade.setLName(lastName); 22. facade.setAddress(address); 23. 24. 25. /Clientisnotrequiredtoaccesssubsystemcomponents. 26. booleanresult=facade.saveCustomerData(); 27. if(result) 28. validateCheckResult= 29. ValidCustomerData:DataSavedSuccessfully; 30. else 31. validateCheckResult= 32. InvalidCustomerData:DataCouldNotBeSaved; 33. 34. catch(ex) 35. .out.println( 36. Error:Pleasechecktoensurethe+ 37. remoteserverisrunning+ 38. ex.getMes
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年作物科學與技術(shù)專業(yè)技能考核試卷及答案
- 2025年智能財務(wù)管理師考試試題及答案
- 2025年職業(yè)健康管理師考試試題及答案
- 2025年投資分析師考試試卷及答案
- 2025年網(wǎng)絡(luò)數(shù)據(jù)分析師考試題及答案
- 2025年國際貿(mào)易專業(yè)考生模擬考試試卷及答案
- 2025年非營利組織管理與運營考試試題及答案
- 2025年金融學理論與實務(wù)測試試題及答案
- 2025年教育心理學綜合考試試題及答案
- 2025年景觀設(shè)計與生態(tài)評估考試試題及答案
- GB/T 21739-2008家用電梯制造與安裝規(guī)范
- GB 21670-2008乘用車制動系統(tǒng)技術(shù)要求及試驗方法
- GA/T 1275-2015石油儲罐火災撲救行動指南
- 家務(wù)服務(wù)員理論考試試題題庫及答案
- 交通安全培訓課件-道路交通事故十大典型案例-P
- 投標報名登記表格式
- DB4211T12-2022醫(yī)療廢物暫存間衛(wèi)生管理規(guī)范
- 第二講公文語言及結(jié)構(gòu)(1語言)分析課件
- 氯氧鉍光催化劑的晶體結(jié)構(gòu)
- 低壓電氣裝置的設(shè)計安裝和檢驗第三版
- 國際商務(wù)管理超星爾雅滿分答案
評論
0/150
提交評論