为生存而奔跑

   :: 首页 :: 联系 :: 聚合  :: 管理
  271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

留言簿(5)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 324043
  • 排名 - 74

最新评论

阅读排行榜

评论排行榜

代理模式,个人认为就是把你要使用的一个对象尽享封装,包装。编程原对象的一个副本,在使用的时候直接使用他这个副本就可以了!他的作用用专业点的语言描 述就是为其他的对象提供一个代理方便控制这个对象。当我们不能直接调用另外一个对象,但是又不得不用这个对象的某些功能,此时代理对象就能起到链接客户和 目标对象的一个代理.
代理模式一般涉及到三个角色,分别为:
1. 抽象角色:他提供真实对象和代理对象的共同接口。
2. 代理角色:通俗地说,代理角色是对原对象(目标对象)进行包装,他有着和原对象相同的接口,并且可以执行真实对象的操作。
3. 真实角色:即目标对象,最终我们需要对他的操作。
代理模式分为两种,一 静态代理,二 动态代理。

接下来我们介绍一下两种代理模式:

一 静态代理
   静态代理即 代理对象和被代理对象在代理之前已经确定好了。他们一起实现相同的接口或者是继承相同的抽象类。例如:
Java代码
  1. //定义抽象角色  
  2. public abstract class AbsRole{  
  3.   abstract public void work();  
  4. }  


Java代码
  1. //定义真实角色  
  2. public class RealRole extends AbsRole{  
  3.   public RealRole(){ }  
  4.   
  5.   public void work(){  
  6.     System.out.println("调用真实角色中函数!");  
  7.   }  
  8. }  

Java代码
  1. //代理角色  
  2. public class ProxyRole extends AbsRole{  
  3.   public RealRole real ;  
  4.     
  5.   public ProxyRole(){  
  6.   }  
  7.   
  8.   public void work(){  
  9.     this.beforeMethod();  
  10.     if(real == null){  
  11.       real = new RealRole();  
  12.     }  
  13.     real.work();  
  14.     this.endMethod();  
  15.   }  
  16.   
  17.   public void beforeMethod(){  
  18.     System.out.println("代理前执行函数->beforeMethod()");  
  19.   }  
  20.     
  21.   public void endMethod(){  
  22.     System.out.println("代理时候后执行函数->endMethod()");  
  23.   }  
  24. }  


各种角色我们都已经定义好了,我们开始测试一下。

Java代码
  1. public class Main(){  
  2.   public static void main(String[] args){  
  3.     AbsRole ar = new ProxyRole();  
  4.     ar.work();  
  5.   }  
  6. }  


二 动态代理
  顾名思义,就是不知道到底那个类需要做代理,在使用的时候,更具情况临时决定。
   java动态代理主要是使用java.lang.reflect包中的两个类。
1. interface InvocationHandler: 他中定义了一个方法
Java代码
  1. public Object invoke(Object obj,Method method,Object[] obs)  

  其中第一个参数 obj 指的是代理类,method是被代理的方法,obs是指被代理的方法的参数组。此方法由代理类来实现。
2. Proxy:该类为动态代理类,主要包括以下内容:

Java代码
  1. protected Proxy(InvocationHandler h);  
  2.   
  3. static Class getProxyClass(ClassLoader loader,Class[] interfaces);  
  4.   
  5. static Object newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h);  


动态代理其实是在运行时生成class,所以,我们必须提供一组interface,然后告诉他class已经实现了这些interface,而且在生成Proxy的时候,必须给他提供一个handler,让他来接管实际的工作。
现在我们把静态代理的例子修改一下:
Java代码
  1. //定义抽象角色;  
  2. public interface AbsRole{  
  3.   public void work();  
  4. }  


接下来定义真实角色;
Java代码
  1. public class RealRole implements AbsRole{  
  2.   public RealRole(){};  
  3.     
  4.   public void work(){  
  5.     System.out.println("调用真实角色方法:RealRole.work()");  
  6.   }  
  7. }  

然后书写动态代理编码
Java代码
  1. public class DynamicProxyRole implements InvocationHandler{  
  2.   private Object sub;  
  3.     
  4.   public DynamicProxyRole(){}  
  5.   
  6.   public DynamicProxyRole(Object ob){  
  7.     this.sub = ob;  
  8.   }  
  9.   
  10.   public Object invoke(Object proxy, Method method, Object[] obs) throws Throwable{  
  11.     method.invke(sub,obs);  
  12.     return null;  
  13.   }  
  14. }  

代理类已经书写完毕,看看是否能正常运行。
Java代码
  1. public class Main{  
  2.   public static void main(String[] args){  
  3.     RealRole  rr  = new RealRole();  
  4.     InvocationHandler dynamicProxy = new DynamicProxyRole(rr);  
  5.     Class<?> cls = rr.getClass();  
  6.       
  7.     AbsRole r = (AbsRole)Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),DynamicProxyRole);  
  8.     r.work();  
  9.   }  
  10. }  


调试成功,动态代理功能完成。

通过静态代理和动态代理学习,我们小结一下:
静态代理需要事先确定代理对象和被代理对象,他们要一起继承或者是实现相同的抽象类。动态代理可以在使用的时候传入真实对象,得到代理。动态代理还是主要依靠java本身的语言特性,实现代理,更加方便
posted on 2009-11-28 13:13 baby-fly 阅读(493) 评论(0)  编辑 收藏 引用 所属分类: Design Pattern

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理