代理模式定义
代理模式,英文名Proxy Pattern,是一种结构型设计模式,代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接地调用实际的对象。
代理模式通过代理对象控制对原对象的访问,并允许在访问前或访问后做一些处理。
代理模式作用
通过代理模式,我们可以很好地做到功能的分离,在用户无感知的情况下,在方法执行的前后增加一些操作,增强代码的功能。
代理模式分类
代理模式主要分为两类,静态代理和动态代理。
1.静态代理
静态代理是由程序员编写的代理类,并在程序运行前就编译好的,而不是由程序动态产生代理类,这就是所谓的静态代理。
2.动态代理
可以服务多个接口实现类,可以在程序运行时,通过反射机制动态创建代理对象。
代理模式角色
代理模式的主要分为3大角色,如下图所示:
1.抽象主题(Subject)角色
抽象主题角色:通过接口,或抽象类声明真实主题和代理对象实现的业务方法。
2.真实主题(Real Subject)角色
实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
3.代理(Proxy)类角色
提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问控制或扩展真实主题的功能。
代理模式实现
1.定义抽象主题
//抽象主题 interface Subject { void Request(); }
2.定义真实主题
//真实主题 class RealSubject implements Subject { public void Request() { System.out.println("访问真实主题方法..."); } }
3.定义代理角色
//代理 class Proxy implements Subject { private RealSubject realSubject; public void Request() { if (realSubject == null) { realSubject = new RealSubject(); } preRequest(); realSubject.Request(); postRequest(); } public void preRequest() { System.out.println("访问真实主题之前的预处理。"); } public void postRequest() { System.out.println("访问真实主题之后的后续处理。"); } }
4.代理测试
public class ProxyTest { public static void main(String[] args) { Proxy proxy = new Proxy(); proxy.Request(); } }
代理模式应用场景
- 日志的采集
- 权限控制
- 实现aop
- Mybatis mapper
- Spring的事务
- 全局捕获异常
- Rpc远程调用接口
- 分布式事务原理代理数据源
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》