设计模式-代理模式

发布于 — 2019 年 10 月 14 日
#design

原理解析

代理模式(Proxy Design Pattern)在不改变原始类(或叫被代理类)代码的情况下, 通过引入代理类来给原始类附加功能.

我们可以通过继承或其他方式来实现静态代理, 来实现对原始类的功能扩展.

动态代理

如果需要代理的类太多, 使用静态代理就需要为每个类都创建一个代理类, 这样过于复杂, 我们可以使用动态代理来实现. 事先不为每个原始类编写代理类, 而是在运行时, 动态的创建原始类对应的代理类, 然后在系统中用代理类替换掉原始类.

Spring AOP底层的实现原理就是基于动态代理, 用户配置好需要给哪些类创建代理, 并定义好在执行原始类的业务代码前后执行哪些附加功能. Spring为这些类创建动态代理对象, 并在JVM中替代原始类对象.

代理模式的应用场景

  1. 业务系统的非功能性需求开发

    比如需要开发一些非功能性的需求, 监控, 统计, 鉴权, 限流等等. 将这些附加功能与业务功能解耦, 放到代理类中同样处理.

  2. 代理模式在RPC, 缓存中的应用

    实际上RPC框架也可以看作一种代理模式. 通过远程代理, 将网络通信, 数据编解码等细节隐藏起来.

    同样在缓存中, 我们对于某些接口希望在一定时间内的相同参数使用缓存中的结果, 而不是进行数据库查询或者其他计算, 我们可以利用代理模式, 先从缓存中查询, 如果查询不到结果再去走原始类的逻辑.

代理、桥接、装饰器、适配器4种设计模式的区别