zoukankan      html  css  js  c++  java
  • [Java] 静态代理 动态代理

    原理

    • 静态代理=代理模式
    • 动态代理=代理模式+反射
    • 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强
    • 代理类和被代理类应该共同实现一个接口,或者是共同继承某个类
    • 静态代理是事先定义好的,当需要附加的功能较多时,或代理的类较多时,代码量也会随之增大
    • 通过动态代理,代理类和被代理类在代码上实现了解耦,可在运行时动态地创建原始类对应的代理类,然后在系统中用代理类替换掉原始类,代理类和被代理类可以灵活组合,而不再增加代码量

    应用

    • Spring AOP 中,用户配置好需要给哪些类创建代理,并定义好在执行原始类的业务代码前后执行哪些附加功能,Spring为这些类创建动态代理对象,并在JVM中替代原始类对象,原本在代码中执行的原始类方法,被换做执行代理类的方法,实现了为原始类附加功能的目的
    • 业务系统的非功能性需求开发
    • RPC框架(远程代理)
    • 缓存

    同装饰器的联系与区别

    • 代理(proxy)和装饰器(decorator)都能给类增加功能
    • 区别在于,代理关注对象的信息隐藏及访问控制,体现封装性,装饰器关注为对象动态地添加功能,调整代码时更加灵活,体现多态性
    • 代理适用于业务无关,抽象度高,稳定度高的场景(如缓存);装饰器适用于偏重业务相关,定制化诉求高,改动频繁的场景
    • 使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰器能够在运行时递归地被构造
    • 代理强调对实际执行者的替代(代售点代替铁路局卖票,买票人不关心谁卖),装饰强调对自身的增强(为面包加果酱和蔬菜成为三明治,后期也可能想加点别的)
    • 二者容易混淆的原因在于,同样是A对B进行了修饰,站在A的角度,A就是代理,站在B的角度,A就是装饰器。而Java中类名是Proxy,用的多了就习惯把两种模式都称为代理
    • Java IO 使用了装饰器,用户在使用的时候,可以任意组装,达到自己想要的效果

    参考

    轻松学,Java 中的代理模式及动态代理

    https://blog.csdn.net/briblue/article/details/73928350

    装饰模式与代理模式的区别

    https://blog.csdn.net/qq_34680763/article/details/99983866

    https://zhuanlan.zhihu.com/p/97499017

  • 相关阅读:
    CSS介绍
    docker入门
    nginx+uWSGI+django+virtualenv+supervisor发布web服务器
    niginx入门
    常用服务安装部署
    VIM
    linux基本命令
    linux目录分级
    OpenStack共享组件
    kvm认识和安装
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12992099.html
Copyright © 2011-2022 走看看