“Github:https://github.com/nateshao/design-demo/tree/main/JavaDesignPatterns/15-proxy
“相信大家都听过代理模式,有静态代理,JDK动态代理,Cglib代理(Spring的内容)。接下来,千羽和大家一起学习一下这些代理模式各有优缺点和相应的使用场景。
商品代购示意图
分析
还有这种类型
定义:
“代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
代理模式的结构
代理模式包含以下3个角色:
Subject
(抽象主题角色)Proxy
(代理主题角色)RealSubject
(真实主题角色)抽象主题类典型代码:
public abstract class Subject {
public abstract void request();
}
真实主题类典型代码:
public class RealSubject extends Subject{
public void request() {
//业务方法具体实现代码
}
}
代理类典型代码:
public class Proxy extends Subject {
private RealSubject realSubject = new RealSubject(); //维持一个对真实主题对象的引用
public void preRequest() {
…...
}
public void request() {
preRequest();
realSubject.request(); //调用真实主题对象的方法
postRequest();
}
public void postRequest() {
……
}
}
几种常见的代理模式
某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下:
该软件公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,而且可能在将来还要在该信息查询模块中增加一些新的功能。
现使用代理模式设计并实现该收费商务信息查询系统。
实例分析及类图
商务信息查询系统设计方案示意图
商务信息查询系统结构图
实例代码
AccessValidator
:身份验证类,业务类Logger
:日志记录类,业务类Searcher
:抽象查询类,充当抽象主题角色RealSearcher
:具体查询类,充当真实主题角色ProxySearcher
:代理查询类,充当代理主题角色Client
:客户端测试类结果分析
动机
结构
动机
应用
Proxy类
InvocationHandler接口
动态代理实例
“某软件公司欲为公司OA系统数据访问层DAO增加方法调用日志,记录每一个方法被调用的时间和调用结果,现使用动态代理进行设计和实现。
实例代码
AbstractUserDAO
:抽象用户DAO类,抽象主题角色AbstractDocumentDAO
:抽象文档DAO类,抽象主题角色UserDAO
:用户DAO类,具体主题角色DocumentDAO
:文档DAO类,具体主题角色DAOLogHandler
:自定义请求处理程序类Client
:客户端测试类模式优点
模式优点——逐个分析
模式缺点
模式适用环境