`

用Java动态代理实现委托模式

    博客分类:
  • java
阅读更多

      委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。委托模式使得我们可以用聚合来替代继承,它还使我们可以模拟mixin。
“委托”在C#中是一个语言级特性,而在Java语言中没有直接的对应,但是我们可以通过动态代理来实现委托!代码如下:

Java代码 复制代码
  1. import java.lang.reflect.InvocationHandler;   
  2. import java.lang.reflect.Method;   
  3. import java.lang.reflect.Proxy;   
  4. /*  
  5.  * @author Liusheng  
  6.  * 实现“委托”模式,用户需要实现InvocationHandler接口;  
  7.  * 参考:http://www.uml.org.cn/j2ee/200411036.htm  
  8.  */  
  9. public abstract class Delegator implements InvocationHandler {   
  10.     //RelegateTo针对每个对象都要生成一个实例,因而非Static的log,代价比较高。   
  11.     //protected Log _log = LogFactory.getLog(this.getClass());     
  12.     //private static Log _log = LogFactory.getLog(RelegateTo.class);   
  13.     //--------------------------------------------   
  14.     protected Object obj_orgin = null;  //原始对象   
  15.     protected Object obj_proxy = null;  //代理对象   
  16.     //--------------------------------------------   
  17.     public Delegator()  {   
  18.         //空   
  19.     }   
  20.     public Delegator(Object orgin){   
  21.         this.createProxy(orgin);   
  22.     }   
  23.     //--------------------------------------------   
  24.     protected Object createProxy(Object orgin) {   
  25.         obj_orgin = orgin;   
  26.         obj_proxy = Proxy.newProxyInstance(   
  27.                 orgin.getClass().getClassLoader(),  //加载器   
  28.                 orgin.getClass().getInterfaces(),   //接口集   
  29.                 this);  //委托   
  30.         //_log.debug("# 委托代理:"+obj_proxy);   
  31.         return obj_proxy;   
  32.     }      
  33.     protected Object invokeSuper(Method method, Object[] args)   
  34.     throws Throwable {   
  35.         return method.invoke(obj_orgin, args);     
  36.     }   
  37.     //--------------实现InvocationHandler接口,要求覆盖------------   
  38.     public Object invoke(Object obj, Method method, Object[] args)   
  39.     throws Throwable {   
  40.         // 缺省实现:委托给obj_orgin完成对应的操作   
  41.         if (method.getName().equals("toString")) {  //对其做额外处理   
  42.             return this.invokeSuper(method, args)+"$Proxy";   
  43.         }else {     //注意,调用原始对象的方法,而不是代理的(obj==obj_proxy)   
  44.             return this.invokeSuper(method, args);   
  45.         }   
  46.     }   
  47. }  


下面的代码,则是作为一个委托的例子,实现Map的功能。

Java代码 复制代码
  1. import java.io.IOException;   
  2. import java.lang.reflect.Method;   
  3. import java.util.Hashtable;   
  4. import java.util.Map;   
  5. import org.apache.commons.logging.Log;   
  6. import org.apache.commons.logging.LogFactory;   
  7. import com.bs2.core.UtilLog;   
  8. /**  
  9.  * @author Liusheng  
  10.  * 本代码主要用于演示RelegateTo的使用方法  
  11.  */  
  12. public class Delegator4Map extends Delegator {   
  13.     private static Log _log = LogFactory.getLog(Delegator4Map.class);   
  14.     private Map orginClass = null;  //原始对象   
  15.     private Map proxyClass = null;  //代理对象   
  16.        
  17.     public Map getOrgin() { return orginClass;  }   
  18.     public Map getProxy() { return proxyClass;  }   
  19.        
  20.     public Delegator4Map(Map orgin) {   
  21.         super(orgin);   
  22.         orginClass = orgin;   
  23.         proxyClass = (Map)super.obj_proxy;   
  24.     }   
  25.     public Object invoke(Object obj, Method method, Object[] args)   
  26.     throws Throwable {   
  27.         if (method.getName().equals("size")) {  //修改close处理逻辑   
  28.             _log.debug("原始 size()="+super.invoke(obj, method, args));   
  29.             Object res2 = new Integer(-1);   
  30.             _log.debug("修改 size()="+res2);   
  31.             return res2;   
  32.         }else {   
  33.             return super.invoke(obj, method, args);   
  34.         }   
  35.     }      
  36.     public static void main(String[] args) throws IOException {   
  37.         UtilLog.configureClassPath("resources/log4j.properties"false);   
  38.         Delegator4Map rtm = new Delegator4Map(new Hashtable());   
  39.         Map m = rtm.getProxy();   
  40.         m.size();   
  41.         _log.debug("代理:"+m.toString());   
  42.     }   
  43. }  


注意:UtilLog仅仅是用于配置log4j属性文件位置,如果log4j.properties就在缺省的运行路径下,则无需单独配置。或者用System.out输出来替代_log输出。

分享到:
评论

相关推荐

    java动态代理实现与原理详细分析.docx

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。  代理模式是常用的java设计模式,他的特征是代理类与委托类有...

    java静态代理和动态代理详解

    Java中提供了一个java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。代理类在运行时会根据被代理接口自动生成,并且可以通过InvocationHandler接口对方法进行增强。

    观察者模式Vs事件委托Demo

    java 观察者模式 事件委托

    java静态代理与动态代理

     代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个...

    cgLib与JDK动态代理的用法

    代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类...

    详解Observer Pattern(观察者模式)在Java中的使用原理

    对于C#的委托、代理概念所使用的Callback(回调模式--参见本人的“第一个C#程序Hello World ”资源)来看,Java Swing编程是纯粹的OO语言、是一种非常优雅的编程语言(本人认为)--而C#的学习好像非常强调所谓的OO思想...

    Java的23种设计模式疯狂Java总结.doc

    设计模式3 1.1 创立型模式4 1.1.1 工厂方法4 1.1.2 抽象工厂6 1.1.3 建造...代理模式34 1.3 行为型模式37 1.3.1 责任链模式37 1.3.2 命令模式40 1.3.3 解释器模式43 1.3.4 迭代器模式45 1.3.5 中介者模式49 1.3.6 备忘...

    Java 代理(proxy)模式

     代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个...

    用PHP的反射实现委托模式的讲解

    委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式...

    JAVA_API1.6文档(中文)

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

    java的5种模式.docx

    代理模式(Proxy Pattern) 定义:Provide a surrogate or placeholder for another object to control access to it. (为其他对象提供一种代理以控制对这个对象的访问。) ● Subject 抽象主题角色 抽象主题类可以是...

    Java 1.6 API 中文 New

    org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...

    php设计模式之委托模式

    委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式...

    Java软件体系结构设计模式

    Java软件体系结构设计模式之结构模式(11种)  结构模式主要用来:  1)处理把责任委托给...  1)装饰器模式用于动态地扩展一个对象的功能,而不需要改变原始的类代码或使用继承。这一点是通过在一个实际对象的外

    从Java的角度来讲解C#的代理、事件和事件句柄的原理

    所以,本人根据Java的监听器概念实现的观察者模式,重新用C#代码来描述了C#的难点技术--代理、事件、事件句柄--^_^...希望能够给C#的fan们带来帮助。 阅读条件:熟悉C#语言,会使用csc命令。 阅读人员:非常熟悉...

    java api最新7.0

    org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...

    JavaAPI1.6中文chm文档 part1

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

    JavaAPI中文chm文档 part2

    java.lang.instrument 提供允许 Java 编程语言代理检测运行在 JVM 上的程序的服务。 java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供...

Global site tag (gtag.js) - Google Analytics