代理模式
- 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
- 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
- 代理模式分为静态代理、动态代理,本篇博文 主要讲解静态代理
静态代理
- 静态代理:由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。
- 简单实现例子: 计算一个 Sql 调用的总时间。
设计思路与代码示例:
- 创建一个 SqlService 接口类
public interface SqlService {
void executeSql() throws InterruptedException;
}
- 创建 SqlService 的 实现:
public class SqlServiceImpl implements SqlService {
// 真正执行业务逻辑的地方
public void executeSql() throws InterruptedException {
System.out.println("Sql 开始执行.....");
Thread.sleep(1000);
System.out.println("Sql 执行结束.....");
}
}
- 创建 SqlProxy 代理类
public class SqlProxy implements SqlService{
// 需要代理的对象
private SqlService target;
// 接受需要代理对象
public SqlProxy(SqlService target) {
this.target = target;
}
// 执行共有逻辑,并调用业务逻辑代码
public void executeSql() throws InterruptedException {
// 开始执行时间
Long startTime = System.currentTimeMillis();
// 真正执行的方法 (此处可以设计的更公有化,暂不讨论,后面会讲解动态代理)
target.executeSql();
// 执行结束
Long endTime = System.currentTimeMillis();
System.out.println(target.getClass().getName()+"执行executeSql耗时"+(endTime-startTime)+"ms");
}
}
- Test 类:
public class Test {
public static void main(String[] args) throws InterruptedException {
// 真正使用的对象
SqlService target = new SqlServiceImpl();
// 代理对象
SqlProxy sqlServiceProxy = new SqlProxy(target);
// 执行代码
sqlServiceProxy.executeSql();
}
}
- 执行结果:
Sql 开始执行.....
Sql 执行结束.....
com.lot.zy.test.SqlServiceImpl执行executeSql耗时1001ms
分析:
1、先有程序设计者实现 SqlService 接口 方法;
2、当Test 调用 SqlServiceImpl.executeSql() 方法时,通过代理 SqlProxy 来执行 , 并执行相关其他公共逻辑
3、总体而言, 开始 -->> 代理类 --> 执行业务类 -->> 代理类 —>> 结束。
后续:
1、静态代理: https://blog.youkuaiyun.com/zhangyong01245/article/details/90519769
2、Java 动态代理实现: https://blog.youkuaiyun.com/zhangyong01245/article/details/90598309
3、CGLIB动态代理以及逻辑: https://blog.youkuaiyun.com/zhangyong01245/article/details/90644933