A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄业凌 中级黑马   /  2012-4-30 11:46  /  3079 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看完代理,想听听大家对代理的理解:)

3 个回复

倒序浏览
1 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用
2  代理模式一般涉及到的角色有
    a 抽象角色:声明真实对象和代理对象的共同接口
    b 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
    c 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象
3  Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类:
  a    Interface InvocationHandler:该接口中仅定义了一个方法
    – public object invoke(Object obj,Method method,  Object[] args)
   b  在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args 为该方法的参数数组。这个抽象方法在代理类中动态实现。
  c   Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容
     (1) protected Proxy(InvocationHandler h):构造函数,用于给内部的h赋值。
     (2 ) static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
     (3)  static Object newProxyInstance(ClassLoader  loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)
4  所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class 就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作
回复 使用道具 举报
本帖最后由 隋营营 于 2012-4-30 15:02 编辑

代理的实现方式有继承聚合。聚合比继承灵活,以下以聚合为例。
  • 静态代理:代理类和被代理类都要实现同一个接口,而代理类中可以持有被代理类或其它代理类的引用。即每个代理类中都可以聚合接口类型的对象。这样只要改变代理类持有的其它代理类的类型就可以变换不同的代理组合方式!但是静态代理只能针对某个特定的类进行代理,扩展性差;而且若有很多类要实现代理,用静态代理就显得繁琐了,所以引出了动态代理。
  • 动态代理的思路:只要一个类实现了某个接口,就能生成对这个类的代理。在这里要用到一个总代理的概念,假设这个总代理是Proxy,它有一个静态方法newProxyInstance,可以通过Proxy.newProxyInstance()这种形式来得到任意的代理类的对象的实例,而不必关心这个代理类的名称。这个newProxyInstance()方法是这样实现的:将某个具体的代理类的实现逻辑存储在一个字符串中,当总代理要使用这个代理时,才会编译这个代理类,生成这个代理类的实例,由newProxyInstance()方法返回这个生成的实例。当然在这个字符串中可以写任意代理类的实现,这就实现了简洁和可扩展性的完美统一。
回复 使用道具 举报
按照代理类的创建时期,代理类可分为两种。
l静态代理类:由程序员创建或由特定工具自动生成
源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
l动态代理类:在程序运行时,运用反射机制动态创建而成。
可以看出静态代理类有一个很不爽的缺点:当如果接口加一个方法
(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现。
这就增加了代码的复杂度。动态代理就可以避免这个缺点。

动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),
这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
动态代理类只能代理接口,代理类都需要实现InvocationHandler类,
实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,
该invoke方法返回的值是被代理接口的一个实现类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马