代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?
因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。
再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的
想法。public interface Sourceable {  public void method();
}  public class Source implements Sourceable {  @Override  public void method() {  System.out.println("the original method!");  }
}  public class Proxy implements Sourceable {  private Source source;  public Proxy(){  super();  this.source = new Source();  }  @Override  public void method() {  before();  source.method();  atfer();  }  private void atfer() {  System.out.println("after proxy!");  }  private void before() {  System.out.println("before proxy!");  }
}public class ProxyTest {  public static void main(String[] args) {  Sourceable source = new Proxy();  source.method();  }  }  输出:before proxy!
the original method!
after proxy!
代理模式的应用场景:
如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:
1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
使用代理模式,可以将功能划分的更加清晰,有助于后期维护!jdk动态代理
特点:只能对实现了接口的类生产代理,不能针对类定义接口
/** * 创建业务接口,包含业务可以提供对外的接口 * */
public interface UserService{  /** * 目标方法  */  public void add();
}  定义实现类
/** * 创建业务接口实现类 * */
public class UserServiceImpl implements UserService{  @Override  public void add() {  System.out.println("----------add----------");  }
} 定义代理
/** * 自定义简单的Invocation,对接口提供的方法进行增强 *  * @author Fighter * @date 2016-04-19 */
public class MyInvocationHandler implements InvocationHandler {  //目标对象  private Object target;  /** * 构造方法 * @param target 目标对象 */  public MyInvocationHandler(Object target) {  super();  this.target=target;  }  * 执行目标对象的方法  */  public Object invoke(Object proxy, Method method, Object[] args)  throws Throwable {  //在目标方法执行前简单打印一下  System.out.println("----------before----------");  //执行目标方法对象  Object result=method.invoke(target, args);  //在目标方法执行之后简单打印一下  System.out.println("----------after----------");  return result;  }  /** * 获取目标对象的代理对象 * @return 代理对象 * this.target.getClass().getInterfaces()//获取被代理对象实现的所有接口*/  public Object getProxy(){  return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),   this.target.getClass().getInterfaces(),this);  }  }jdk动态代理测试public class ProxyTest{  @Test  public void testProxy() throws Throwable{  //实例化目标对象  UserService userService=new UserServiceImpl();  //实例化Invocation  MyInvocationHandler invocationHandler=new MyInvocationHandler(userService);  //根据目标生成代理对象  UserService proxy=(UserService)invocationHandler.getProxy();  //调用代理对象方法  proxy.add();  }
} CGLIB动态代理示例
DK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对
类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是
继承,所以不能对final修饰的类进行代理。 CGLIB是一个强大的高性能的代码生成包。定义实现类
/**  * 这个是没有实现接口的实现类   *   */
public class BookFacadeImpl {    public void addBook() {    System.out.println("增加图书的普通方法...");    }
}  /**  * 使用cglib动态代理  *   */
public class BookFacadeCglib implements MethodInterceptor {    private Object target;    /**  * 创建代理对象  *   * @param target  * @return  */    public Object getInstance(Object target) {    this.target = target;    Enhancer enhancer = new Enhancer();    enhancer.setSuperclass(this.target.getClass());    // 回调方法    enhancer.setCallback(this);    // 创建代理对象    return enhancer.create();    }    @Override    // 回调方法    public Object intercept(Object obj, Method method, Object[] args,    MethodProxy proxy) throws Throwable {    System.out.println("事物开始");    proxy.invokeSuper(obj, args);    System.out.println("事物结束");    return null;    }    } public class TestCglib {    public static void main(String[] args) {    BookFacadeCglib cglib=new BookFacadeCglib();    BookFacadeImpl bookCglib=(BookFacadeImpl)cglib.getInstance(new BookFacadeImpl());    bookCglib.addBook();    }
}总结
CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所
花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK
方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。

代理模式 、JDK动态代理、cglib动态代理相关推荐

  1. Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

    反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...

  2. 两万字吐血总结,代理模式及手写实现动态代理(aop原理,基于jdk动态代理)

    代理模式及手写实现动态代理 一.代理模式 1. 定义 2. 示例 (1)静态代理 (2)动态代理 3. 通用类图 4. 代理模式的优点 二.jdk动态代理实现原理 1. jdk动态代理源码分析(通过该 ...

  3. 轻松学,Java 中的代理模式(proxy)及动态代理

    我们先来分析代理这个词. 代理 代理是英文 Proxy 翻译过来的.我们在生活中见到过的代理,大概最常见的就是朋友圈中卖面膜的同学了. 她们从厂家拿货,然后在朋友圈中宣传,然后卖给熟人. 按理说,顾客 ...

  4. java代理模式-原来你是这样的代理

    这几天在看一些框架源码时看到了一个很奇妙的设计模式,有种熟悉个感觉,一时想不出是什么模式,后面经过了解才知道是动态代理,就这样带着好奇心学习了这个模式,更深入了解代理会发现不仅有静态和动态,还有很多其 ...

  5. 代理模式——静态代理,动态代理(JDK代理和CGLib代理)

    概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问. 这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. Java中的代理按照代理类生成时机不同又分为 ...

  6. 代理模式(Java版)-静态代理、JDK动态代理和CGLib动态代理

    代理模式前传 前几天有个小朋友问到我代理模式,这个我拿手的嘛.废话不多说,直接开讲?这是不可能的. 一般呢,讲模式之前呢,礼貌上都要讲个前传.象我这种老了根本不怕没有故事祭奠的人,随手一个前传开始. ...

  7. Java动态代理之JDK实现和CGlib实现

    一:代理模式(静态代理) 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由 业务实现类.业务代理类 两部分组成.业务实现类 负责实现 ...

  8. 【过程记录】aop学习·实现动态代理的jdk方法和cglib方法和使用实例

    文章目录 介绍 jdk动态代理实例 cglib动态代理实例 介绍 JDK的动态代理只能代理实现了接口的类,而不能实现接口的类就不可以使用JDK动态代理,cglib是针对类来实现代理的,它的原理是针对指 ...

  9. python中代理模式分为几种类型_代理模式

    JDK 自带的动态代理 java.lang.reflect.Proxy:生成动态代理类和对象: java.lang.reflect.InvocationHandler(处理器接口):可以通过invok ...

  10. 设计模式(11)代理模式The Proxy Pattern - 1 - 远程代理rmi

    代理模式 假设现在需要设置一个监视器Monitor,能够监视糖贩卖机GumballMachine的状态,位置信息.还有多少糖果等.一个简单的想法就是创建一个Monitor的类,构造参数包括Gumbal ...

最新文章

  1. PC-lint 的代码实例
  2. WPF使用IDataErrorInfo进行数据校验
  3. CSS实现鼠标移入图片边框有小三角
  4. 直播预告 | AAAI 2022论文解读:基于生成模型的语音/歌声合成与歌声美化
  5. java线性表合并_单链表的合并(Java实现)
  6. CSS——规避脱标流和vertical-align
  7. java 匹配mysql按钮_使用Java在mysql查询中设置匹配函数
  8. 源码包编译安装python_Python3.7源码包编译安装-Go语言中文社区
  9. 改善深层神经网络:超参数调整、正则化以及优化 —— 3.1调试处理
  10. 服务器摆放需要预留U位么_卧室系列 | 选床+摆放新姿势,提升睡眠品质小技巧...
  11. 基于Multisim_UA741的四种波形发生器电路仿真
  12. 使用eclipse创建一个web登录界面项目
  13. Power bi 超市经典案例之销售分析(二)
  14. linux将一段时间内文件压缩,在 Linux 上压缩文件的 5 种方法
  15. 电脑蓝屏了,错误代码:0x000000CE: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
  16. background多背景
  17. 云服务器liunx系统怎么安装,云服务器怎么安装linux系统
  18. 电子产品长时间不充电导致无法开机、故障、充不满电等问题(如kindle:电池+叹号)
  19. influxdb内存过大和占用过多端口
  20. 如何使用WordPress插件添加约会预约日历

热门文章

  1. 数字图像基础,分辨率
  2. Python笔记(3)
  3. Dart 基礎 - 4
  4. SAPGUI系统登录页面配置的SAProuter有什么用 1
  5. shell 变量定义使用
  6. dubbo应用程序的单元测试环境搭建(springtest,powermock,mockito)
  7. Java+大数据开发——Hadoop集群环境搭建(二)
  8. Canvas scale- 缩放
  9. Post/Redirect/Get模式防止表单重复提交
  10. functools学习有感