当前位置:首页 > CN2资讯 > 正文内容

java 代理模式

3天前CN2资讯

代理(proxy)模式:指目标对象给定代理对象,并由代理对象代替真实对象控制客户端对真实对象的访问。

代理模式模式有以下角色:

抽象主题(subject)角色:声明真实主题和代理主题的共同接口。

真实主题(real subject)角色:定义代理对象需要代理的真实对象。

代理主题(proxy subject)角色:代替真实对象来控制对真实对象的访问,代理对象持有真实对象的应用,从而可以随时控制客户端对真实对象的访问。

代理模式结构类图:

代理模式在java里面很常见,在开源框架里如spring,mybatis等里面大量使用。现实生活中也很常见,比如我们访问facebook主站,常会选择一些代理,通过代理访问facebook。代理分静态代理和动态代理,java对动态代理有很好的支持,提供了InvocationHandler接口和Proxy类。

java API 对InvocationHandler接口和Proxy类的介绍:

Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。创建某一接口 Foo 的代理:

     InvocationHandler handler = new MyInvocationHandler(...);      Class proxyClass = Proxy.getProxyClass(          Foo.class.getClassLoader(), new Class[] { Foo.class });      Foo f = (Foo) proxyClass.          getConstructor(new Class[] { InvocationHandler.class }).          newInstance(new Object[] { handler });

或使用以下更简单的方法:

     Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),                                           new Class[] { Foo.class },                                           handler);

动态代理类(以下简称为代理类)是一个实现在创建类时在运行时指定的接口列表的类,该类具有下面描述的行为。 代理接口 是代理类实现的一个接口。 代理实例 是代理类的一个实例。 每个代理实例都有一个关联的调用处理程序 对象,它可以实现接口 InvocationHandler。通过其中一个代理接口的代理实例上的方法调用将被指派到实例的调用处理程序的 Invoke 方法,并传递代理实例、识别调用方法的 java.lang.reflect.Method 对象以及包含参数的 Object 类型的数组。调用处理程序以适当的方式处理编码的方法调用,并且它返回的结果将作为代理实例上方法调用的结果返回。InvocationHandler 是代理实例的调用处理程序 实现的接口。每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。 

这里举个好理解的例子:公司项目部需要CEO签署一个文件,项目负责人会把文件交给CEO助理,助理会收文件,等到CEO回来后递CEO,CEO签署后交给助理,助理收好交给项目负责人。这个过程中项目负责人其实不知道是否真的是CEO签署的文件,有可能是助理打印的CEO的签名到文件上。这样助理就是一个代理角色,代替CEO处理事务。静态代理类图如下:

代码如下: 

Java代码 

  • package proxy;  
  •   
  • /** 
  •  
  •  *  
  •  
  •  *作者:alaric 
  •  
  •  *时间:2013-7-24下午10:44:12 
  •  
  •  *描述:抽象主题 
  •  
  •  */  
  •   
  • public interface Leader {  
  •   
  •     public void sign();  
  •   
  • }  
  • Java代码 

  • package proxy;  
  • /** 
  •  *  
  •  *作者:alaric 
  •  *时间:2013-7-24下午10:45:05 
  •  *描述:ceo  真实主题 
  •  */  
  • public class CEO implements Leader {  
  •   
  •     @Override  
  •     public void sign() {  
  •         System.out.println("CEO签文件");  
  •     }  
  •   
  • }  
  • Java代码 

  • package proxy;  
  • /** 
  •  *  
  •  *作者:alaric 
  •  *时间:2013-7-24下午10:45:25 
  •  *描述:代理主题 
  •  */  
  • public class Assistant implements Leader{  
  •   
  •     private Leader leader ;  
  •       
  •       
  •     public Assistant(Leader leader) {  
  •         super();  
  •         this.leader = leader;  
  •     }  
  •   
  •   
  •     @Override  
  •     public void sign() {  
  •         System.out.println("递给领导");  
  •         leader.sign();  
  •         System.out.println("装入袋子,送出");  
  •     }  
  •       
  •   
  • }  
  • Java代码 

  • package proxy;  
  •   
  • import java.lang.reflect.InvocationHandler;  
  • import java.lang.reflect.Method;  
  • import java.lang.reflect.Proxy;  
  • /** 
  •  *  
  •  *作者:alaric 
  •  *时间:2013-7-24下午10:46:04 
  •  *描述:动态代理的Handler 
  •  */  
  • public class AssistantHandler implements InvocationHandler {  
  •       
  •     /** 
  •      * 目标对象 
  •      */  
  •     private Object targetObject;    
  •         
  •      
  •     /** 
  •      *  
  •      *作者:alaric 
  •      *时间:2013-7-24下午10:46:59 
  •      *描述:创建代理对象 这段也可以不在此类,也可以放在客户端里面 
  •      */  
  •     public Object createProxy(Object targetOjbect){    
  •         this.targetObject = targetOjbect;    
  •         return Proxy.newProxyInstance(targetOjbect.getClass().getClassLoader(),    
  •                 targetOjbect.getClass().getInterfaces(), this);    
  •     };    
  •     
  •    
  •     /** 
  •      * 此方法为必须实现的,在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。  
  •      */  
  •     @Override    
  •     public Object invoke(Object proxy, Method method, Object[] args)    
  •             throws Throwable {    
  •         Object result = null;    
  •         System.out.println("递给领导");  
  •         result = method.invoke(this.targetObject, args);    
  •         System.out.println("装入袋子,送出");  
  •         return result;    
  •     }    
  •   
  • }  
  • Java代码 

  • package proxy;  
  •   
  • import java.lang.reflect.Proxy;  
  •   
  • /** 
  •  *  
  •  *作者:alaric 
  •  *时间:2013-7-24下午10:44:37 
  •  *描述:测试类  包括静态代理和动态代理 
  •  */  
  • public class Client {  
  •   
  •     /** 
  •      * @param args 
  •      */  
  •     public static void main(String[] args) {  
  •         //静态代理测试  
  •         CEO ceo = new CEO();  
  •         Leader leader1 = new Assistant(ceo);  
  •         leader1.sign();  
  •           
  •         System.out.println("=========================================");  
  •         //动态代理测试,一些三种方式都可以获得动态代理对象  
  •         AssistantHandler ah = new AssistantHandler(ceo);  
  •         //Leader leader2 = (Leader) ah.createProxy(new CEO());  
  •         //leader2.sign();  
  •       
  •         //Leader leader3 = (Leader) Proxy.newProxyInstance(CEO.class.getClassLoader(),    
  •         //      ceo.getClass().getInterfaces(), ah);    
  •         //leader3.sign();  
  •           
  •         Leader leader4 = (Leader) Proxy.newProxyInstance(Leader.class.getClassLoader(),  
  •                  new Class[] { Leader.class },  
  •                  ah);  
  •         leader4.sign();  
  •           
  •     }  
  •   
  • }  
  •  运行结果如下:

    递给领导

    CEO签文件

    装入袋子,送出

    =========================================

    递给领导

    CEO签文件

    装入袋子,送出

    通过上面例子和代码可以看出,动态代理显得更为灵活,实际过程中动态代理也较为常用。


      你可能想看:

      扫描二维码推送至手机访问。

      版权声明:本文由皇冠云发布,如需转载请注明出处。

      本文链接:https://www.idchg.com/info/24527.html

      分享给朋友:

      “java 代理模式” 的相关文章

      性价比VPS:高效节约的虚拟专用服务器选择指南

      在讨论性价比VPS之前,我觉得先弄清楚什么是性价比VPS特别重要。简而言之,性价比VPS是指在一定的价格范围内,提供较高的性能和稳定性的虚拟专用服务器。这类服务在近几年变得越来越受欢迎,特别是对于那些预算有限但又希望拥有高质量主机服务的人来说,性价比高的VPS就像是一道光,照亮了他们的选择之路。 性...

      如何通过v2ray回国节点轻松访问中国大陆互联网

      回国节点的基本概念 回国节点在最近几年逐渐成为了许多用户在国外访问中国大陆内容的重要工具。随着互联网的迅猛发展,很多人希望在国外能够轻松访问国内的一些服务和网站,而v2ray提供的回国节点正好满足了这样的需求。通过这些节点,用户可以实现网络回国,无缝连接到中国大陆的互联网。 v2ray是一个灵活而高...

      BT开心版:简化Linux服务器管理的最佳工具

      BT开心版是一个强大的Linux服务器管理工具,致力于简化网站的搭建、管理和维护过程。对于那些刚接触Linux操作系统的用户来说,BT开心版的出现无疑是一大福音。它的设计理念是让每个用户无论有多少技术背景,都能高效地管理自己的网页,不必深入学习Linux系统的复杂操作。 首先,我发现BT开心版的最大...

      VPS Pro - 理想的虚拟专用服务器解决方案

      什么是 VPS Pro VPS Pro 是一种先进的虚拟专用服务器解决方案,提供用户高度可定制的服务器环境。与传统的共享主机或物理服务器相比,VPS Pro 以虚拟化技术为基础,让每位用户享有像独立服务器一样的资源和灵活性。这种技术不仅提升了资源的利用率,还为用户提供了更高的控制权限。 在VPS P...

      获取国外动态IP服务的指南与优势

      在当今互联网的世界中,动态IP(Dynamic IP)逐渐成为了一个重要的概念。它指的是由互联网服务提供商(ISP)动态分配的、可变的IP地址。与固定不变的静态IP相比,每次连接互联网时,动态IP都可能发生变化。这种灵活性不仅高效利用了IP资源,还在多个领域产生了实际应用的优势。 动态IP的特点非常...

      如何查看域名是否被墙:检测工具与方法指南

      域名被墙是一个对很多网站管理员和用户来说都比较陌生的概念。简单来说,当一个网站的内容被认为敏感或者违反某些规定时,防火墙就会把这个域名屏蔽。即使用户通过输入域名试图访问,DNS 解析也许正常,但实际上网站却无法顺利加载。在国内用户访问国外网站或者国外用户尝试访问国内网站时,情况尤为明显,就好像在国际...