结构型模式之代理模式

一、概述

1.1 定义

Proxy Design, 在不改变原始类(被代理类)的情况下,通过代理类给原始类添加一些附加功能

1.2 解决的问题

存在的问题:业务代码和非业务功能,放在一个方法中。一方面违背了单一职责原则;另一方面,未来新增其他非业务功能时,需要修改源代码,违背了开闭原则,同时代码的可读性,非业务扩展性都不好。
代理的优势:解决了上述场景下存在的问题,将业务(核心)功能非业务功能解耦,降低耦合度,符合单一职责和开闭原则,代码的扩展性和可读性增强。

二、 实现原理

2.1 整体链路图

代理对象和原始对象的交互逻辑

2.2 代理类型

代理模式类别定义特点运行阶段优缺点
静态代理实现同一接口的代理类针对本项目包中的接口/组合模式编译期需要为每个类增加代理类,导致类的个数极速增加,同时扩展性不强
静态代理继承原始类的代理类针对第三方包,无法修改第三方包的类/继承模式编译期需要为每个类增加代理类,导致类的个数极速增加,同时扩展性不强
动态代理JDK代理类只针对有接口的实现类运行期可以动态为每个类生成代理类
动态代理Cglib代理类针对非抽象类的继承类运行期可以动态为每个类生成代理类
模式优缺点应用场景
组合模式优点:组合模式是基于接口来实现的,因此可以对所有的子类进行扩展,而不需要添加额外的代码,扩展性好
缺点:需要为接口所有的方法做代理
针对接口的代理
继承模式优点:只需要针对需要扩展的方法进行代理
缺点:只能针对单一父类进行扩展
针对非抽象类的代理

2.3 实现原理

2.3.1 JDK代理

核心原理: 字节码重组技术

  1. 通过反射获取被代理类的引用,并获取所有的被代理类的接口;
  2. JDK代理类重新生成一个类,该类要实现被代理类的接口;
  3. 动态的生成java代码,新增加的非业务逻辑由自定义的逻辑代码实现;
  4. 编译新生成的.java代码的.class文件;
  5. 重新加载到JVM中执行。
2.3.2 Cglib代理

核心原理: 主要通过Enhance来设置superCls以及callback来实现

2.3.3 两者区别
代理类别运行阶段技术手段执行方式
JDK代理运行期直接重写字节码底层采用反射的方式调用,执行效率低
cglib代理运行期通过ASM框架重写字节码,比JDK代理效率低采用FastClass方式执行,效率更高

三、使用场景

  1. 给原有对象增加额外功能。业务系统的非功能性需求开发。例如监控、统计、鉴权、限流、事务以及日志等;
  2. 远程代理。RPC调用其他服务的方法时,生成的代理对象会执行一些网络通信,序列化和反序列化等非业务功能。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桃花猿

客官,赏点打酒钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值