代理模式简要介绍_第1页
代理模式简要介绍_第2页
代理模式简要介绍_第3页
代理模式简要介绍_第4页
代理模式简要介绍_第5页
免费预览已结束,剩余8页可下载查看

下载本文档

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

文档简介

1、描述:让我们思考一下下面的代码:    /Client 1. class Customer  2.   public void someMethod()  3.     /Create the Service Provider Instance  4.     FileUtil futilObj=new FileUtil();&

2、#160; 5.     /Access the Service  6.     futilObj.writeToFile(“Some Data);  7.     8.           作为它实现的一局部,Customer类创立了一个FileUtil类的一个实例并且直接访问它的效劳。换句话说,对于客户对象,访问FileUtil对象的方式是很直

3、接的。它的实现可能是客户对象访问效劳提供者对象最为普通的方式了。相比拟,有些时候客户对象可能不直接访问效劳提供者也就是指目标对象,这种情况是由于下面的原因导致的:1    目标对象的位置?目标对象可能存在于同一台或者不同机器的不同地址空间。2    目标对象的存在形式?目标对象可能直到他被请求效劳的时候还不存在,或者对象被压缩。3    特殊的行为?目标对象可以根据客户对象的访问权限接受或拒绝效劳。在多线程环境,一些效劳提供者对象需要特殊的考虑。  

4、60; 在这些情况下,代理模式Proxy Pattern建议不要使有特殊需求的客户对象直接访问目标对象,而是使用一个单独的别离的对象也就是指代理对象为不同的客户提供通常的、直接的访问目标对象的方式。    代理对象提供和目标对象一样的接口。代理对象负责与目标对象交互的细节,代表客户对象与目标对象交互。所以客户对象不再需要处理访问目标对象的效劳时的特殊需求。客户对象通过它的接口调用代理对象,代理对象直接把这些调用依次地传递给目标对象。客户对象不需要知道代理的原对象目标对象。代理对象隐藏了与客户对象进行交互的对象细节,如:对象是否是远程的

5、、是否初始化、是否需要特殊的权限等。换句话说,代理对象作为客户和不可访问的远程对象或推迟初始化对象之间的透明桥梁。   代理对象因使用的场景不同,代理的种类也不同。让我们来快速的浏览一下一些代理和它们的目标。注意:表23.1列出了不同种类的代理对象,在一章中,仅讨论远程代理,其他的一些代理会在本书后面的模式中讨论。Table 23.1: List of Different Proxy Types 代理类型     目的 远程代理

6、0;   提供对在不同地址空间的远程对象的访问缓存代理/效劳代理    为了提供能够保存目标操作经常用到的结果,代理对象以存储方式保存这些结果。当客户对象请求同一个操作时,代理不需要直接访问目标对象,而是从存贮介质返回操作结果。防火墙代理    使用防火墙代理主要是为了保护目标对象以防止有害客户的访问。同时也可以防止客户访问有害的目标对象。保护代理    提供了不同客户访问不同层次的目标对象的功能。在创立代理时,定义了一个权限的集合。虽后,这些权

7、限用来限制访问代理的特定局部,如果没有执行方法的权限,客户对象不允许访问特定的方法。同步代理    提供了允许不同的客户对象平安的同步访问目标对象的功能。计数代理    在执行目标对象的方法前,提供了一些审计机制。代理模式和其他模式从讨论不同的代理对象中可以看出:代理对象有两个主要的特征:1    它介于客户对象和目标对象之间。2    它接受客户对象的调用,然后转发调用给目标对象。在这种情形下,看上去和本书中前面讨论的其他模式有些相似

8、。让我们讨论一下代理模式和一些与它相似的模式之间的相同点和不同点。代理模式和装饰模式:代理模式:1    客户对象不能直接访问目标对象2    代理对象提供了对目标对象的访问控制在保护代理中3    代理对象不能再增加其他的功能。装饰模式:1    如果需要,客户对象不能直接访问目标对象。2    装饰对象不能控制对目标对象的访问。3    装饰对象可以增加

9、额外的功能。代理模式和外观模式:代理模式:1    代理对象代表一个单一对象。2    客户对象不能直接访问目标对象。3    代理对象提供了对于单一目标对象的访问控制。外观模式:1    外观对象代表了对象的一个子系统。2    如果必要,客户对象可以直接访问子系统中的对象。3    一个外观对象提供了一个对子系统组件的简单的、高层次的接口.代理模式和责任

10、链模式:代理模式:1    代理对象代表了一个单一的对象。2    克辉请求首先被代理对象所接受,但是不直接被代理对象处理。3    客户请求总是被传递给目标对象。4    假设客户与效劳器正常工作,可以保证请求会得到响应,责任链模式:1    责任链包括很多对象。2    接受客户请求的对象首先处理请求。3    近

11、当现在的接收者不能处理请求时,客户请求才被传递给下一个对象。4    不能保证请求会得到响应。也就是请求已经到达责任链尾,担仍然没有被处理。在Java中,远程方法调用RMI充分的利用了远程代理模式,让我们快速的浏览一下远程方法调用RMI的概念和远程方法调用RMI通信过程应用的组件。RMI:快速浏览RMI使客户对象像访问本地对象一样访问远程对象并调用其方法成为可能。如图23.1 Figure 23.1: Clients View of Its Communication wit

12、h a Remote Object Using RMI 下面是为实现RMI功能而一起协作的不同组件。1    远程接口Remote Interface?一个远程对象必须实现一个远程接口这个接口扩展e。远程接口声明可以被客户访问的远程对象的方法。换句话说,远程接口可以看成远程对象对客户的视图。需求(要求):1)    扩展java.rmi.Remote2)    在远程接口中定义的所有方法必须声明抛出ion异

13、常。2    远程对象Remote Object?远程对象负责实现在远程接口中定义的方法。需求(要求):1    必须提供远程接口的实现。2    必须扩展t类。3    必须有一个没有参数的构造函数。4    必须与一个效劳器相关联。通过调用零参数的构造函数,效劳器创立远程对象的一个实例。3    RMI注册表RMI Registry?

14、RMI注册表提供了保持不同远程对象的地址空间。1    远程对象需要存储在一个客户可以通过命名引用Name reference来访问它的RMI注册表中。2    一个给定的命名引用仅可以存储一个对象。4    客户Client?客户是一个试图访问远程对象的应用程序。1    必须可以感知被远程对象实现的接口。2    通过命名引用Name reference在RMI注册表中可以

15、查到远程对象。一旦查到远程对象的引用,调用这个引用上的方法。5RMIC (Java RMI 桩编译器)Java RMI stub compiler?一旦远程对象编译成功,RMICJava RMI 桩编译器可以生成远程对象的桩类文件(stub)和框架类文件(skeleton)。桩类文件(stub)和框架类文件(skeleton)从编译的远程对象类中产生。这些桩类文件(stub)和框架类文件(skeleton) 使客户对象以无缝的方式访问远程对象成为可能。下面这局部描述客户对象和远程对象如何通信。RMI通信机

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

17、上。在效劳器端,RMIC产生的远程对象的框架文件(skeleton)接受这个调用。    框架文件(skeleton)在效劳器端,不需要拷贝到客户机器上。框架文件(skeleton)负责将这些调用转发到真正的远程对象的实现上。一旦远程对象执行了方法,方法返回的结果将按照反方向返回给客户。    图23.2说明了RMI通信的过程 Figure 23.2: The Actual RMI Communication Process 了解更多的

18、关于Java RMI的知识,推荐阅读RMI tutorialRMI和远程代理模式:    从RMI通信的讨论中,可以看到桩类文件扮演着远程对象的远程代理的角色。它使得客户访问远程对象就像访问本地对象一样成为可能。因此,一些使用了RMI技术的应用就已经暗含着代理模式的实现。例子:    在讨论外观模式时,我们建立了一个简单的客户数据管理应用来验证和保存输入的客户数据。我们的设计由分别代表不同客户数据的三个类组成。在应用外观模式以前,客户AccountManager可以直接与子系统的三个用来验证、保

19、存客户数据的类交互。应用外观模式,我们定义了一个CustomFacade外观对象代表客户与三个子系统类交互如图23.3。 Figure 23.3: Customer Data Management Application for the Local Mode of Operation?Class Association 在这个应用中,子系统组件和外观对象对于客户对象AccountManager都是本地的。现在,让我们建立这个应用的不同版本,这个版本已远程的

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

21、tomer Data Management Application for the Remote Mode of Operation?Class Association     让我们开始运用RMI技术设计远程操作模式下的客户数据管理应用。第一步,先定义远程接口CustomerIntr:这个借口要满足:1    声明外观实现的方法。2    所有的方法声明抛出Remo

22、teException异常。3    扩展e接口。1. public interface CustomerIntr extends java.rmi.   2.   void setAddress( inAddress) throws RemoteException;  3.   void setCity( inCity) throws RemoteException

23、;  4.   void setState( inState) throws RemoteException;  5.   void setFName( inFName) throws RemoteException;  6.   void setLName( inLName) throws RemoteException;  7.   void 

24、setCardType( inCardType) throws RemoteException;  8.   void setCardNumber( inCardNumber)  9.     throws RemoteException;  10.   void setCardExpDate( inCardExpDate)  11.     throws&

25、#160;RemoteException;  12.   boolean saveCustomerData() throws RemoteException;  13.       让我们重新定义CustomerFacade外观类,因为它要实现CustomerIntr远程接口。不同的客户对象通过CustomerIntr接口在具体类CustomerFacade上的实现与子系统对象进行交互。图23.5展示了CustomerFacade和它实现的远程接口CustomerIntr之间

26、的结构和关联。Listing 23.1: CustomerFacade Class?Revised 1. public class CustomerFacade extends UnicastRemoteObject  2.   implements CustomerIntr   3.   private  address;  4.   private  city;&

27、#160; 5.   private  state;  6.   private  cardType;  7.   private  cardNumber;  8.   private  cardExpDate;  9.   private  fname;  10.   private  lname;

28、0; 11.   public CustomerFacade() throws RemoteException   12.     super();  13.     .out.println("Server object created");  14.     15.   public static void

29、0;main(  args) throws    16.      port = "1099"  17.      host = "localhost"  18.     /Check for hostname argument  19.   

30、60; if (args.length = 1)   20.       host = args0;  21.       22.     if (args.length = 2)   23.       port = args1

31、;  24.       25.     if (.getSecurityManager() = null)   26.       .setSecurityManager(new RMISecurityManager();  27.       28.     /Create&

32、#160;an instance of the server  29.     CustomerFacade facade = new CustomerFacade();  30.     /Bind it with the RMI Registry  31.     Naming.bind("/"

33、 + host + ":" + port + "/CustomerFacade,  32.                 facade);  33.     .out.println("Service Bound");  34.

34、     35.   public void setAddress( inAddress)  36.     throws RemoteException   37.     address = inAddress;  38.     39.   public void setCity( 

35、inCity)  40.     throws RemoteException city = inCity;  41.     42.   public void setState( inState)  43.     throws RemoteException state = inState;  44.  

36、;   45.   public void setFName( inFName)  46.     throws RemoteException fname = inFName;  47.     48.   public void setLName( inLName)  49.     throw

37、s RemoteException lname = inLName;  50.     51.   public void setCardType( inCardType)  52.     throws RemoteException   53.     cardType = inCardType;  54. 

38、60;   55.   public void setCardNumber( inCardNumber)  56.     throws RemoteException   57.     cardNumber = inCardNumber;  58.     59.   public void setCar

39、dExpDate( inCardExpDate)  60.     throws RemoteException   61.     cardExpDate = inCardExpDate;  62.     63.   public boolean saveCustomerData() throws RemoteException  6

40、4.     Address objAddress;  65.     Account objAccount;  66.     CreditCard objCreditCard;  67.     /*  68.      client is transparent from 

41、the following  69.      set of subsystem related operations.  70.     */  71.     boolean validData = true;  72.      errorMessage = "&

42、quot;  73.     objAccount = new Account(fname, lname);  74.     if (objAccount.isValid() = false)   75.       validData = false;  76.     &#

43、160; errorMessage = "Invalid FirstName/LastName"  77.       78.     objAddress = new Address(address, city, state);  79.     if (objAddress.isValid() = fal

44、se)   80.       validData = false;  81.       errorMessage = "Invalid Address/City/State"  82.       83.     objCreditCard = new&#

45、160;CreditCard(cardType, cardNumber,  84.                     cardExpDate);  85.     if (objCreditCard.isValid() = false)   86.   

46、    validData = false;  87.       errorMessage = "Invalid CreditCard Info"  88.       89.     if (!validData)   90.     

47、  .out.println(errorMessage);  91.       return false;  92.       93.     if (objAddress.save() && objAccount.save() &&  94.      

48、0;  objCreditCard.save()   95.       return true;  96.       else   97.       return false;  98.       99.     100. 

49、0;  Figure 23.5: Façade Design?Remote Mode of Operation     因为子系统组件对于CustomerFacade类是本地的,子系统组件初始化、方法调用的方式上没有任何变化,子系统组件对于CustomerFacade类仍然是本地对象。当执行的时候,CustomerFacade自己创立一个实例并把引用名称reference name保存在RMI注册表中。客户对象通过引用名称能取得远程对象的一个拷贝。

50、0;   因为客户不需要直接访问任何的子系统组件。所以在远程操作模式下的设计中,不需要对子系统的任何组件进行任何的修改。让我们重新设计客户类AccountManager:Listing 23.2: AccountManager Class?Revised   1.          2.           3. public void&

51、#160;actionPerformed(ActionEvent e)   4.           5.           6.   if (e.getActionCommand().equals(  7.         AccountManager.VALIDA

52、TE_SAVE)   8.     /get input values  9.      firstName = objAccountManager.getFirstName();  10.      lastName = objAccountManager.getLastName();  11.     &

53、#160;address = objAccountManager.getAddress();  12.            13.            14.     try   15.       /Call registry

54、0;for AddOperation  16.       facade = (CustomerIntr) Naming.lookup ("rmi:/" +  17.                objAccountManager.getRMIHost() + &qu

55、ot;:" +  18.                objAccountManager.getRMIPort() +  19.                "/CustomerFacade");  20. 

56、0;     facade.setFName(firstName);  21.       facade.setLName(lastName);  22.       facade.setAddress(address);  23.            24.    

57、        25.       /Client is not required to access subsystem components.  26.       boolean result = facade.saveCustomerData();  27.   

58、;    if (result)   28.         validateCheckResult =  29.           " Valid Customer Data: Data Saved Successfully "

59、0; 30.         else   31.         validateCheckResult =  32.           " Invalid Customer Data: Data Could Not Be Saved "  33.         34.

温馨提示

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

评论

0/150

提交评论