




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、描述:讓我們思考一下下面的代碼:/ClientclassCustomer publicvoidsomeMethod() /CreatetheServiceProviderInstanceFileUtilfutilObj=newFileUtil(); /AccesstheServicefutilObj.writeToFile(“SomeData”); 作為它實現的一部分,Customer類創建了一個FileUtil類的一個實例并且直接訪問它的服務。換句話說,對于客戶對象,訪問FileUtil對象的方式是很直接的。它的實現可能是客戶對象訪問服務提供者對象最為普通的方式了。相比較,有些時候客戶對象可
2、能不直接訪問服務提供者(也就是指目標對象),這種情況是由于下面的原因導致的:(1)目標對象的位置?目標對象可能存在于同一臺或者不同機器的不同地址空間。(2)目標對象的存在形式?目標對象可能直到他被請求服務的時候還不存在,或者對象被壓縮。(3)特殊的行為?目標對象可以根據客戶對象的訪問權限接受或拒絕服務。在多線程環境,一些服務提供者對象需要特殊的考慮。在這些情況下,代理模式(ProxyPattern)建議不要使有特殊需求的客戶對象直接訪問目標對象,而是使用一個單獨的(分離的)對象(也就是指代理對象)為不同的客戶提供通常的、直接的訪問目標對象的方式。代理對象提供和目標對象一樣的接口。代理對象負責與
3、目標對象交互的細節,代表客戶對象與目標對象交互。所以客戶對象不再需要處理訪問目標對象的服務時的特殊需求。客戶對象通過它的接口調用代理對象,代理對象直接把這些調用依次地傳遞給目標對象。客戶對象不需要知道代理的原對象(目標對象)。代理對象隱藏了與客戶對象進行交互的對象細節,如:對象是否是遠程的、是否初始化、是否需要特殊的權限等。換句話說,代理對象作為客戶和不可訪問的遠程對象或推遲初始化對象之間的透明橋梁。代理對象因使用的場景不同,代理的種類也不同。讓我們來快速的瀏覽一下一些代理和它們的目標。注意:表23.1列出了不同種類的代理對象,在一章中,僅討論遠程代理,其他的一些代理會在本書后面的模式中討論。
4、Table23.1:ListofDifferentProxyTypes代理類型目的遠程代理提供對在不同地址空間的遠程對象的訪問緩存代理/服務代理為了提供能夠保存目標操作經常用到的結果,代理對象以存儲方式保存這些結果。當客戶對象請求同一個操作時,代理不需要直接訪問目標對象,而是從存貯介質返回操作結果。防火墻代理使用防火墻代理主要是為了保護目標對象以防止有害客戶的訪問。同時也可以防止客戶訪問有害的目標對象。保護代理提供了不同客戶訪問不同層次的目標對象的功能。在創建代理時,定義了一個權限的集合。雖后,這些權限用來限制訪問代理的特定部分,如果沒有執行方法的權限,客戶對象不允許訪問特定的方法。同步代理提
5、供了允許不同的客戶對象安全的同步訪問目標對象的功能。計數代理在執行目標對象的方法前,提供了一些審計機制。代理模式和其他模式從討論不同的代理對象中可以看出:代理對象有兩個主要的特征:(1)它介于客戶對象和目標對象之間。(2)它接受客戶對象的調用,然后轉發調用給目標對象。在這種情形下,看上去和本書中前面討論的其他模式有些相似。讓我們討論一下代理模式和一些與它相似的模式之間的相同點和不同點。代理模式和裝飾模式:代理模式:(1)客戶對象不能直接訪問目標對象(2)代理對象提供了對目標對象的訪問控制(在保護代理中)(3)代理對象不能再增加其他的功能。裝飾模式:(1)如果需要,客戶對象不能直接訪問目標對象。
6、(2)裝飾對象不能控制對目標對象的訪問。(3)裝飾對象可以增加額外的功能。代理模式和外觀模式:代理模式:(1)代理對象代表一個單一對象。(2)客戶對象不能直接訪問目標對象。(3)代理對象提供了對于單一目標對象的訪問控制。外觀模式:(1)外觀對象代表了對象的一個子系統。(2)如果必要,客戶對象可以直接訪問子系統中的對象。(3)一個外觀對象提供了一個對子系統組件的簡單的、高層次的接口.代理模式和責任鏈模式:代理模式:(1)代理對象代表了一個單一的對象。(2)克輝請求首先被代理對象所接受,但是不直接被代理對象處理。(3)客戶請求總是被傳遞給目標對象。(4)假設客戶與服務器正常工作,可以保證請求會得到
7、響應,責任鏈模式:(1)責任鏈包括很多對象。(2)接受客戶請求的對象首先處理請求。(3)近當現在的接收者不能處理請求時,客戶請求才被傳遞給下一個對象。(4)不能保證請求會得到響應。也就是請求已經到達責任鏈尾,擔仍然沒有被處理。在Java中,遠程方法調用(RMI)充分的利用了遠程代理模式,讓我們快速的瀏覽一下遠程方法調用(RMI)的概念和遠程方法調用(RMI)通信過程應用的組件。RMI:快速瀏覽RMI使客戶對象像訪問本地對象一樣訪問遠程對象并調用其方法成為可能。(如圖23.1)Figure23.1:ClientsViewofItsCommunicationwithaRemoteObjectUsi
8、ngRMI下面是為實現RMI功能而一起協作的不同組件。(1)遠程接口(RemoteInterface)?一個遠程對象必須實現一個遠程接口(這個接口擴展java.rmi.Remote)。遠程接口聲明可以被客戶訪問的遠程對象的方法。換句話說,遠程接口可以看成遠程對象對客戶的視圖。需求(要求):1)擴展java.rmi.Remote2)在遠程接口中定義的所有方法必須聲明拋出java.rmi.RemoteException異常。(2)遠程對象(RemoteObject)?遠程對象負責實現在遠程接口中定義的方法。需求(要求):1)必須提供遠程接口的實現。2)必須擴展java.rmi.server.Uni
9、castRemoteObject類。3)必須有一個沒有參數的構造函數。4)必須與一個服務器相關聯。通過調用零參數的構造函數,服務器創建遠程對象的一個實例。(3)RMI注冊表(RMIRegistry)?RMI注冊表提供了保持不同遠程對象的地址空間。1)遠程對象需要存儲在一個客戶可以通過命名引用(Namereference)來訪問它的RMI注冊表中。2)一個給定的命名引用僅可以存儲一個對象。(4)客戶(Client)?客戶是一個試圖訪問遠程對象的應用程序。1)必須可以感知被遠程對象實現的接口。2)通過命名引用(Namereference)在RMI注冊表中可以查到遠程對象。一旦查到遠程對象的引用,調
10、用這個引用上的方法。(5)RMIC(JavaRMI樁編譯器)JavaRMIstubcompiler?一旦遠程對象編譯成功,RMIC(JavaRMI樁編譯器)可以生成遠程對象的樁類文件(stub)和框架類文件(skeleton)。樁類文件(stub)和框架類文件(skeleton)從編譯的遠程對象類中產生。這些樁類文件(stub)和框架類文件(skeleton)使客戶對象以無縫的方式訪問遠程對象成為可能。下面這部分描述客戶對象和遠程對象如何通信。RMI通信機制:一般地,客戶對象不能按通常方式直接訪問遠程對象。為了使客戶對象像訪問本地對象一樣訪問遠程對象的服務,RMIC(JavaRMI樁編譯器)生
11、成的遠程對象的樁文件(stub)和遠程接口需要拷貝到客戶機器上。樁文件(stub)負責扮演著遠程對象的(遠程)代理的角色,負責把方法的調用傳遞給真實的遠程對象實現所在的遠程服務器上。任何時候,客戶對象引用遠程對象,這個引用實際上是遠程對象的本地樁文件。也就是,當客戶調用遠程對象上的方法時,調用首先被本地樁實例所接受,樁再將這個調用傳遞到遠程服務器上。在服務器端,RMIC產生的遠程對象的框架文件(skeleton)接受這個調用。框架文件(skeleton)在服務器端,不需要拷貝到客戶機器上。框架文件(skeleton)負責將這些調用轉發到真正的遠程對象的實現上。一旦遠程對象執行了方法,方法返回的
12、結果將按照反方向返回給客戶。圖23.2說明了RMI通信的過程Figure23.2:TheActualRMICommunicationProcess了解更多的關于JavaRMI的知識,推薦閱讀RMItutorialRMI和遠程代理模式:從RMI通信的討論中,可以看到樁類文件扮演著遠程對象的遠程代理的角色。它使得客戶訪問遠程對象就像訪問本地對象一樣成為可能。因此,一些使用了RMI技術的應用就已經暗含著代理模式的實現。例子:在討論外觀模式時,我們建立了一個簡單的客戶數據管理應用來驗證和保存輸入的客戶數據。我們的設計由分別代表不同客戶數據的三個類組成。在應用外觀模式以前,客戶AccountManage
13、r可以直接與子系統的三個用來驗證、保存客戶數據的類交互。應用外觀模式,我們定義了一個CustomFacade外觀對象代表客戶與三個子系統類交互(如圖23.3)。Figure23.3:CustomerDataManagementApplicationfortheLocalModeofOperation?ClassAssociation在這個應用中,子系統組件和外觀對象對于客戶對象AccountManager都是本地的。現在,讓我們建立這個應用的不同版本,這個版本已遠程的方式運行。在遠程方式下,這個應用通過運用JAVARMI技術,訪問遠程對象。在使應用運行在遠程操作模式下的設計中,我們要把子系統組
14、件(Account、Address和CreditCard)和外觀(CustomerFacade)移到遠程服務器上。這樣會帶來以下好處:1)在服務器上的對象可以被不同的客戶應用所共享。客戶不再需要維護這些類的本地版本,因此,成為輕型客戶端(light-weighted)。2)可以對變化、性能和監控進行統一的集中控制。Figure23.4:CustomerDataManagementApplicationfortheRemoteModeofOperation?ClassAssociation讓我們開始運用RMI技術設計遠程操作模式下的客戶數據管理應用。第一步,先定義遠程接口CustomerIntr
15、:這個借口要滿足:1)聲明外觀實現的方法。2)所有的方法聲明拋出RemoteException異常。3)擴展java.rmi.Remote接口。publicinterfaceCustomerIntrextendsjava.rmi. voidsetAddress(inAddress)throwsRemoteException; voidsetCity(inCity)throwsRemoteException; voidsetState(inState)throwsRemoteException; voidsetFName(inFName)throwsRemoteException; voidse
16、tLName(inLName)throwsRemoteException; voidsetCardType(inCardType)throwsRemoteException; voidsetCardNumber(inCardNumber) throwsRemoteException; voidsetCardExpDate(inCardExpDate) throwsRemoteException; booleansaveCustomerData()throwsRemoteException; 讓我們重新定義CustomerFacade外觀類,因為它要實現CustomerIntr遠程接口。不同的客
17、戶對象通過CustomerIntr接口在具體類CustomerFacade上的實現與子系統對象進行交互。圖23.5展示了CustomerFacade和它實現的遠程接口CustomerIntr之間的結構和關聯。Listing23.1:CustomerFacadeClass?RevisedpublicclassCustomerFacadeextendsUnicastRemoteObject implementsCustomerIntr privateaddress; privatecity; privatestate; privatecardType; privatecardNumber; pri
18、vatecardExpDate; privatefname; privatelname; publicCustomerFacade()throwsRemoteException super(); .out.println(Serverobjectcreated); publicstaticvoidmain(args)throws port=1099; host=localhost; /Checkforhostnameargumentif(args.length=1) host=args0; if(args.length=2) port=args1; if(.getSecurityManager
19、()=null) .setSecurityManager(newRMISecurityManager(); /CreateaninstanceoftheserverCustomerFacadefacade=newCustomerFacade(); /BinditwiththeRMIRegistryNaming.bind(/+host+:+port+/CustomerFacade”,facade); .out.println(ServiceBound); publicvoidsetAddress(inAddress) throwsRemoteException address=inAddress
20、; publicvoidsetCity(inCity) throwsRemoteExceptioncity=inCity; publicvoidsetState(inState) throwsRemoteExceptionstate=inState; publicvoidsetFName(inFName) throwsRemoteExceptionfname=inFName; publicvoidsetLName(inLName) throwsRemoteExceptionlname=inLName; publicvoidsetCardType(inCardType) throwsRemote
21、Exception cardType=inCardType; publicvoidsetCardNumber(inCardNumber) throwsRemoteException cardNumber=inCardNumber; publicvoidsetCardExpDate(inCardExpDate) throwsRemoteException cardExpDate=inCardExpDate; publicbooleansaveCustomerData()throwsRemoteException AddressobjAddress; AccountobjAccount; Cred
22、itCardobjCreditCard; /*clientistransparentfromthefollowingsetofsubsystemrelatedoperations.*/ booleanvalidData=true; errorMessage=; objAccount=newAccount(fname,lname); if(objAccount.isValid()=false) validData=false; errorMessage=InvalidFirstName/LastName; objAddress=newAddress(address,city,state); if
23、(objAddress.isValid()=false) validData=false; errorMessage=InvalidAddress/City/State; objCreditCard=newCreditCard(cardType,cardNumber, cardExpDate); if(objCreditCard.isValid()=false) validData=false; errorMessage=InvalidCreditCardInfo; if(!validData) .out.println(errorMessage); returnfalse; if(objAd
24、dress.save()&objAccount.save()& objCreditCard.save() returntrue; else returnfalse; Figure23.5:FaadeDesign?RemoteModeofOperation因為子系統組件對于CustomerFacade類是本地的,子系統組件初始化、方法調用的方式上沒有任何變化,子系統組件對于CustomerFacade類仍然是本地對象。當執行的時候,CustomerFacade自己創建一個實例并把引用名稱(referencename)保存在RMI注冊表中。客戶對象通過引用名稱能取得遠程對象的一個拷貝。因為客戶不需
25、要直接訪問任何的子系統組件。所以在遠程操作模式下的設計中,不需要對子系統的任何組件進行任何的修改。讓我們重新設計客戶類AccountManager:Listing23.2:AccountManagerClass?Revised publicvoidactionPerformed(ActionEvente) if(e.getActionCommand().equals( AccountManager.VALIDATE_SAVE) /getinputvaluesfirstName=objAccountManager.getFirstName(); lastName=objAccountManage
26、r.getLastName(); address=objAccountManager.getAddress(); try /CallregistryforAddOperationfacade=(CustomerIntr)Naming.lookup(rmi:/+ objAccountManager.getRMIHost()+:+ objAccountManager.getRMIPort()+ /CustomerFacade); facade.setFName(firstName); facade.setLName(lastName); facade.setAddress(address); /C
27、lientisnotrequiredtoaccesssubsystemcomponents.booleanresult=facade.saveCustomerData(); if(result) validateCheckResult= ValidCustomerData:DataSavedSuccessfully; else validateCheckResult= InvalidCustomerData:DataCouldNotBeSaved; catch(ex) .out.println( Error:Pleasechecktoensurethe+ remoteserverisrunning+ ex.getMessage(); objAccountManager.setResultDisplay(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年信陽a2貨運從業資格證考試題
- 店鋪出租協議合同材料
- 基準電價和標桿電價
- 基金退出時的違規情形
- 二零二五版店面轉讓協議書簡單范例
- 場地租賃租賃保證金規定
- 公司收購合同范文x二零二五年
- 銷售團隊經理管理制度
- 連鎖藥店績效管理制度
- 道路臨時用地管理制度
- GB/T 3235-2008通風機基本型式、尺寸參數及性能曲線
- GB/T 1447-2005纖維增強塑料拉伸性能試驗方法
- 第四章芳香烴及其代謝產物的測定-節課件
- 廣東省幼兒園一日活動指引(試行)
- 費用報銷單Excel模板
- 普通話水平測試報告
- 小學數學 青島版 二年級上冊《有序數圖形》部優課件
- EGS002:EG8010+IR2110m正弦波逆變器AD16電路圖印制板圖
- 垃圾處理廠概預算
- 過敏性休克應急預案PPT幻燈片(PPT 14頁)
- 廣東省行政執法資格考試題庫(共80頁)
評論
0/150
提交評論