代理模式简要介绍_第1页
代理模式简要介绍_第2页
代理模式简要介绍_第3页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、描述: 让我们思考一下下面的代码:/Client1. class Customer2.public voidsomeMethod()3./Createthe ServiceProvider Instance4.FileUtilfutilObj= newFileUtil();5./Accessthe Service6.futilObj.writeToFile( “Some Data”);7.8. 作为它实现的一部分, Customer 类创建了一个 FileUtil 类的一个实例 并且直接访问它的服务。换句话说,对于客户对象,访问 FileUtil 对象的方式 是很直接的。它的实现可能是客户对象

2、访问服务提供者对象最为普通的方式了。 相比较,有些时候客户对象可能不直接访问服务提供者(也就是指目标对象), 这种情况是由于下面的原因导致的:( 1)目标对象的位置 ?目标对象可能存在于同一台或者不同机器的不同地址空间。( 2)目标对象的存在形式 ?目标对象可能直到他被请求服务的时候还不存在,或者对象被压缩。( 3)特殊的行为 ?目标对象可以根据客户对象的访问权限接受或拒绝服务。在多线程环境,一些服务提供者对象需要特殊的考虑。在这些情况下,代理模式(Proxy Pattern )建议不要使有特殊需求的 客户对象直接访问目标对象,而是使用一个单独的(分离的)对象(也就是指代 理对象)为不同的客户

3、提供通常的、直接的访问目标对象的方式。代理对象提供和目标对象一样的接口。代理对象负责与目标对象交互的 细节,代表客户对象与目标对象交互。所以客户对象不再需要处理访问目标对象 的服务时的特殊需求。客户对象通过它的接口调用代理对象, 代理对象直接把这 些调用依次地传递给目标对象。客户对象不需要知道代理的原对象(目标对象)。 代理对象隐藏了与客户对象进行交互的对象细节,女口:对象是否是远程的、是否初始化、是否需要特殊的权限等。换句话说,代理对象作为客户和不可访问的远 程对象或推迟初始化对象之间的透明桥梁。代理对象因使用的场景不同,代理的种类也不同。让我们来快速的浏览一 下一些代理和它们的目标。注意:

4、表23.1列出了不同种类的代理对象,在一章中,仅讨论远程代理,其他 的一些代理会在本书后面的模式中讨论。Tflble 23.1: Listof Ditto rent Proxy Types基凭对庄不瓷茫址空匍丙远程弋恚旳计宅止芝哇先了提实貶幣三黑兰记咬三垒写茅丟二2去,一巻榛二枣嚨弍溟尋乏全W男.兰宴W对醍诗求到个捉诧廿吃理不英要熱 TsP L- V 3 iffft -左乏"一氓一産三莠乞亠了二7二W云芒二.壬匕三 £氓二塞力讣三有呂列吕丐F象.不胃宮士活2不闫层:二工兰方讨盏巧上貶左创魅于理EJfcXT一个祝罩三員艺昼已 逮全咗覆工来”弓毛于W于理 的粤宦芜分.加果没有执

5、巴右眩的权裁.客户对您不允许说叵痔定的方选椿常丁允许不同的窑空对金泰全的勻滂订瓷=于对盏科=縫.Slf“ A-I三广亍亍巴弋第打=,三.盍寻了一兰車丁吒电*Table 23.1: List of Differe nt Proxy Types代理类型目的远程代理提供对在不同地址空间的远程对象的访问缓存代理/服务代理为了提供能够保存目标操作经常用到的结果,代理对象以存储方式保存这些结果。当客户对象请求同一个操作时,代理不需要直接访问目标 对象,而是从存贮介质返回操作结果。防火墙代理使用防火墙代理主要是为了保护目标对象以防止有害客户 的访问。同时也可以防止客户访问有害的目标对象保护代理 提供了不同客

6、户访问不同层次的目标对象的功能。 在创建代理时, 定义了一个权限的集合。 虽后,这些权限用来限制访问代理的特 定部分,如果没有执行方法的权限,客户对象不允许访问特定的方法。同步代理 计数代理提供了允许不同的客户对象安全的同步访问目标对象的功能。在执行目标对象的方法前,提供了一些审计机制。代理模式和其他模式从讨论不同的代理对象中可以看出:代理对象有两个主要的特征:(1)(2)它介于客户对象和目标对象之间。它接受客户对象的调用,然后转发调用给目标对象。在这种情形下, 看上去和本书中前面讨论的其他模式有些相似。 让我们讨论一下 代理模式和一些与它相似的模式之间的相同点和不同点。代理模式和装饰模式代理

7、模式:(1)(2)(3) 装饰模式:客户对象不能直接访问目标对象 代理对象提供了对目标对象的访问控制(在保护代理中) 代理对象不能再增加其他的功能。(1)(2)(3)如果需要,客户对象不能直接访问目标对象。 装饰对象不能控制对目标对象的访问。 装饰对象可以增加额外的功能。代理模式和外观模式:代理模式:(1)(2)(3) 外观模式:代理对象代表一个单一对象。客户对象不能直接访问目标对象。代理对象提供了对于单一目标对象的访问控制。(1)(2)(3)外观对象代表了对象的一个子系统。如果必要,客户对象可以直接访问子系统中的对象。 一个外观对象提供了一个对子系统组件的简单的、 高层次的接口 .代理模式和

8、责任链模式:代理模式:(1)(2)(3)(4) 责任链模式:代理对象代表了一个单一的对象。 克辉请求首先被代理对象所接受,但是不直接被代理对象处理。 客户请求总是被传递给目标对象。假设客户与服务器正常工作,可以保证请求会得到响应,(1)责任链包括很多对象。(2)接受客户请求的对象首先处理请求。(3)近当现在的接收者不能处理请求时,客户请求才被传递给下一个 对象。(4)不能保证请求会得到响应。也就是请求已经到达责任链尾,担仍 然没有被处理。在Java中,远程方法调用(RM)充分的利用了远程代理模式,让我们快速的浏 览一下远程方法调用(RM)的概念和远程方法调用(RM)通信过程应用的组件RMI:快

9、速浏览RMI使客户对象像访问本地对象一样访问远程对象并调用其方法成为可能。(如图 23.1)Figure 23.1: Client ' s View of ItsCommunication with a Remote ObjectUs ing RMI下面是为实现RMI功能而一起协作的不同组件。(1)远程接口( Remote In terface )?一个远程对象必须实现一个远 程接口(这个接口扩展)。远程接口声明可以被客户访问的远 程对象的方法。换句话说,远程接口可以看成远程对象对客户的视图。需求(要求):1)扩展 2)在远程接口中定义的所有方法必须声明抛出异常。(2)远程对象(Rem

10、ote Object)?远程对象负责实现在远程接口中 定义的方法。需求(要求):1)必须提供远程接口的实现。2)必须扩展 类。3)必须有一个没有参数的构造函数。4)必须与一个服务器相关联。通过调用零参数的构造函数,服务器创 建远程对象的一个实例。(3)RMI注册表(RMI Registry)?RMI注册表提供了保持不同远程 对象的地址空间。1)远程对象需要存储在一个客户可以通过命名引用(Name referenee )来访问它的RMI注册表中。2)一个给定的命名引用仅可以存储一个对象。(4)客户(Client)?客户是一个试图访问远程对象的应用程序。1)必须可以感知被远程对象实现的接口。2)通

11、过命名引用(Name referenee )在RMI注册表中可以查到远程对象。一旦查到远程对象的引用,调用这个引用上的方法。(5) RMIC (Java RMI 桩编译器)Java RMI stub compiler? 一旦远程对 象编译成功,RMI(Java RMI桩编译器)可以生成远程对象的桩类文件(stub) 和框架类文件(skeleton)。桩类文件(stub)和框架类文件(skeleton)从编译的远 程对象类中产生。这些桩类文件(stub)和框架类文件(skeleton) 使客户对象以 无缝的方式访问远程对象成为可能。下面这部分描述客户对象和远程对象如何通信。RMI通信机制:一般地

12、,客户对象不能按通常方式直接访冋远程对象。 为了使客户对象 像访问本地对象一样访问远程对象的服务, RMIC(Java RMI桩编译器)生成 的远程对象的桩文件(stub)和远程接口需要拷贝到客户机器上。桩文件(stub)负责扮演着远程对象的(远程)代理的角色,负责把方法 的调用传递给真实的远程对象实现所在的远程服务器上。 任何时候,客户对象引 用远程对象,这个引用实际上是远程对象的本地桩文件。 也就是,当客户调用远 程对象上的方法时,调用首先被本地桩实例所接受,桩再将这个调用传递到远程 服务器上。在服务器端,RMIC产生的远程对象的框架文件(skeleton)接受这个 调用。框架文件(ske

13、leton)在服务器端,不需要拷贝到客户机器上。框架文件 (skeleto n)负责将这些调用转发到真正的远程对象的实现上。一旦远程对象执行 了方法,方法返回的结果将按照反方向返回给客户。图23.2说明了 RMI通信的过程Figure 23.2: The Actual RMI Communication Process 了解更多的关于Java RMI的知识,推荐阅读 RMI tutorialRMI和远程代理模式:从RMI通信的讨论中,可以看到桩类文件扮演着远程对象的远程代理的 角色。它使得客户访问远程对象就像访问本地对象一样成为可能。因此,一些使用了 RMI技术的应用就已经暗含着代理模式的实现

14、。例子:在讨论外观模式时,我们建立了一个简单的客户数据管理应用来验证和 保存输入的客户数据。我们的设计由分别代表不同客户数据的三个类组成。 在应用外观模式以前,客户AccountManager可以直接与子系统的三个用来验证、 保存客户数据的类交互。应用外观模式,我们定义了一个CustomFacade外观对象代表客户与三个子系统类交互(如图23.3 )。.L<ht*L 一 *Figure 23.3: Customer Data Management Applicationfor the Local Mode of Operation?ClassAssociation在这个应用中,子系统组件

15、和外观对象对于客户对象Accou ntMa nager都是本地的。现在,让我们建立这个应用的不同版本,这个版本已远程的方式运行。在远 程方式下,这个应用通过运用 JAVA RMI技术,访问远程对象。在使应用运行在远程操作模式下的设计中,我们要把子系统组件(Accou nt、Address和CreditCard )和外观(CustomerFacade)移到远程服务器上。这样会 带来以下好处:1) 在服务器上的对象可以被不同的客户应用所共享。客户不再需要维 护这些类的本地版本,因此,成为轻型客户端(light-weighted )。2) 可以对变化、性能和监控进行统一的集中控制。Figure 23

16、.4: Customer Data Management Application for the Rem ote Mode of Operation?Class Association让我们开始运用RMI技术设计远程操作模式下的客户数据管理应用。 第一步,先定义远程接口 CustomerIntr :这个借口要满足:1) 声明外观实现的方法。2) 所有的方法声明抛出 RemoteException异常。3) 扩展 接口。1. public interface CustomerIntr extends java.rmi. 2.3.4.5.6.7.8.9.10.11.12.13.void setAd

17、dress( inAddress) throws RemoteException ; void setCity( inCity) throws RemoteException;void setState( inState) throws RemoteException ;void setFName( inFName) throws RemoteException ;void setLName( inLName) throws RemoteException ; void setCardType( inCardType)throws RemoteException ;void setCardNu

18、mber( inCardNumber)throws RemoteException ;void setCardExpDate( inCardExpDate)throws RemoteException ;boolean saveCustomerData() throws RemoteException ;让我们重新定义 CustomerFacade外观类,因为它要实现 Customerlntr 远程接口。不同的客户对象通过 CustomerIntr 接口在具体类 CustomerFacade 上的实现与子系统对象进行交互。图23.5展示了 CustomerFacade和它实现的远 程接口 Cu

19、stomerIntr 之间的结构和关联。Listing 23.1: CustomerFacade Class?Revised1. public classCustomerFacade extends UnicastRemoteObject2.implementsCustomerIntr3.privateaddress;4.privatecity;5.privatestate;6.privatecardType;7.privatecardNumber;8.privatecardExpDate;9.privatefname;10.privatelname;11.public CustomerFac

20、ade()throwsRemoteException 12.super();13.out.println("Serverobjectcreated" );14.15.public static void main( args) throws16.port= "1099" ;17.host= "localhost" ;18./Checkfor hostname argument19.if (args. length = 1) 20.host= args0;21.22.if (args. length = 2) 23.port= args

21、1;24.25.if (.getSecurityManager() = null ) 26.setSecurityManager( new RMISecurityManager ();27.28./Createan instance of the server29.CustomerFacade facade = new CustomerFacade();30./Bindit with the RMI Registry31.Naming.bind( "/" + host + ":" + port + "/CustomerFacade”,32.fa

22、cade);33.out.pri ntln("Service Bound ";34.35.public voidsetAddress( inAddress)36.throwsRemoteException 37.address= inAddress;38.39.public voidsetCity(inCity)40.throwsRemoteException city = inCity;41.42.public voidsetState(inState)43.throwsRemoteException state = inState;44.45.public voidse

23、tFName( inFName)46.throwsRemoteException fname = inFName;47.48.public voidsetLName( inLName)49.throwsRemoteException lname = inLName;50.51.public voidsetCardType( inCardType)52.throwsRemoteException 53.cardType= inCardType;54.55.public voidsetCardNumber( inCardNumber)56.throwsRemoteException 57.card

24、Number = inCardNumber;58.59.public voidsetCardExpDate( inCardExpDate)60.61.62.63.n64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.throws RemoteException cardExpDate = inCardExpDate;public boolean saveCustomerData() throws RemoteExceptioAddress objAddress;Account objAccount; CreditCard ob

25、jCreditCard; /*client is transparent from the following set of subsystem related operations.*/ boolean validData = true ;errorMessage = "" ; objAccount = new Account(fname, lname); if (objAccount.isValid() = false ) validData = false ;errorMessage = "Invalid FirstName/LastName" ;

26、 objAddress = new Address(address, city, state); if (objAddress.isValid() = false ) validData = false ; errorMessage = "Invalid Address/City/State" ;objCreditCard = new CreditCard(cardType, cardNumber84.85.86.87.88.89.90.91.92.93.94.95.96.97.98.99.100.cardExpDate);if(objCreditCard.isValid(

27、) validData = false ;= false ) iferrorMessage = "InvalidCreditCard Info" ;(!validData) .out.println(errorMessage); return false ; if(objAddress.save() &&objAccount.save() &&objCreditCard.save()return true ;else return false ;Mb甲臺.I 喝p*tri 申 |«4島I羸*i iBf LnC-Lty»-i

28、>vc.CL« rdTrpfl I ELr inq imC"-HriiTyv«|i-3. public4.5.4. if7.8.9.10.11.12.13.14.15.16.+17.Figure 23.5: Facade D esgn_Rem cte F! cde cfO piratenFigure 23.5: Fa?ade Design?Remote Mode ofOperation因为子系统组件对于CustomerFacade类是本地的,子系统组件初始化、 方法调用的方式上没有任何变化,子系统组件对于 CustomerFacade类仍然是本 地对象。当执

29、行的时候,CustomerFacade自己创建一个实例并把引用名称(refereneename保存在RMI注册表中。客户对象通过引用名称能取得远程对象的一个拷贝。因为客户不需要直接访问任何的子系统组件。所以在远程操作模式下的设计中,不需要对子系统的任何组件进行任何的修改。让我们重新设计客户类AccountManager:Listing 23.2: AccountManager Class?Revised1.2.void action Performed( Acti on Eve nte) (e.getActio nComma nd().equals(AccountManager.VALIDAT

30、E_SAVE) /get in put valuesfirstName = objAcco un tMa nager.getFirstName(); lastName = objAcc oun tMa nager.getLastName(); address = objAcco un tMa nager.getAddress();try /Callregistry for AddOperati onfacade = (Customerl ntr) Namin glookup("rmi:/"objAccou ntMa nager.getRMIHost()+18.19.20.2

31、1.22.23.objAccountManager.getRMIPort() "/CustomerFacade" );facade.setFName(firstName);facade.setLName(lastName); facade.setAddress(address);24.25./Client is not required to access subsystem components.26.boolean result = facade.saveCustomerData();27.if (result) 28.validateCheckResult =29.&

32、quot; Valid Customer Data: Data Saved Successfully "30. else 31.validateCheckResult =32." Invalid Customer Data: Data Could Not Be Saved "33.34. catch ( ex) 35.out.println(36."Error: Please check to ensure the " +37."remote server is running" +38.ex.getMessage();39.40.objAccountManager.setResultDisplay(41.validateCh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论