码迷,mamicode.com
首页 > 编程语言 > 详细

浅谈代理 模式与java中的动态代理

时间:2018-09-25 23:29:51      阅读:398      评论:0      收藏:0      [点我收藏+]

标签:request   简单的   jpg   技术   pre   bubuko   for   耦合度   实例   

代理模式的定义:

代理模式是一个使用律非常高的模式,定义如下:
为其他对象提供一种代理,以控制对这个对象的访问。
类图:技术分享图片

简单的静态代理:

public interface IRunner{
    //这是一个代理类和被代理类都需要实现的接口
    //在接口中定义一个抽象函数
    public void request();
}

//下面是真实的被代理类
public class Runner implements IRunner{
//实现接口中的方法
    public void request(){
    //实现具体的业务逻辑
    }
}
//下面是代理类
public class RunnerAgent implements IRunner{
    //要代理哪个实现类
    private IRunner runner  = null;
    //默认被代理者
    public RunnerAgent(IRunner runner){
        this.runner = runner;
    }
    //实现接口中定义的方法
    public void request(){
        this.before();
        this.runner.request();
        this.after();
    }
    //预处理
    private void before(){
    }
    //后处理
    private void after(){
    }

}
  • 我们可以看到静态代理只能代理某一个类,每个类都有一个代理类。在对通用性要求更高的场景下(比如Spring AOP)传统的静态代理不能满足需求,会使类的数目非常庞大,因此又有了动态代理。

    动态代理

    什么是动态代理?动态代理就是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象。动态代理的一个重要应用就是面向切面编程(AOP)
    AOP示意图:
    技术分享图片

通过示意图可以明显的看出来,AOP抽取出非业务逻辑代码,降低了耦合度。
动态代理的通用类图(jdk动态代理,如无特殊声明,以下动态代理均指jdk动态代理)
技术分享图片

  • jdk动态代理 vs cglib动态代理
    jdk动态代理是以接口为中心的,相当于添加类一种对于被调用者没有太大意义的限制。我们实例化的是代理对象,而不是真正被调用的类型,这在实践中可能带来不便。
    如果被调用者没有实现接口,而我们还是希望利用动态代理机制,那么可以考虑其他方式。我们知道Spring AOP支持两种模式的动态代理:jdk动态代理和cglib。如果我们选择cglib方式,就不再依赖接口。
    cglib动态代理采取的方式是创建被代理类的子类。因此要求被代理类不可以用final修饰。
    jdk动态代理的优势:
    最小化依赖关系
    代码实现简单。
    cglib代理优势:
    不需要被代理类实现额外接口。
    只操作我们关心的类,而不必为其他相关类增加工作量。
    高性能。

    代理模式的优点

  • 职责清晰
    真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰。
  • 高扩展性
    具体主题角色是随时都会发生变化的。只要实现了接口,不管如何变化,都离不开接口的规范,那我们的代理类完全就可以在不做任何修改的情况下使用。

参考文献:设计模式之禅 秦小波 著

浅谈代理 模式与java中的动态代理

标签:request   简单的   jpg   技术   pre   bubuko   for   耦合度   实例   

原文地址:https://www.cnblogs.com/dudu19939/p/9704170.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!