Java代理模式-静态代理(1)

代理模式

  1. 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
  2. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
  3. 代理模式分为静态代理、动态代理,本篇博文 主要讲解静态代理

静态代理

  1. 静态代理:由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。
  2. 简单实现例子: 计算一个 Sql 调用的总时间。

设计思路与代码示例:

  1. 创建一个 SqlService 接口类
public interface SqlService {
    void executeSql() throws InterruptedException;
}
  1. 创建 SqlService 的 实现:
public class SqlServiceImpl implements SqlService {
	// 真正执行业务逻辑的地方
    public void executeSql() throws InterruptedException {
        System.out.println("Sql 开始执行.....");
        Thread.sleep(1000);
        System.out.println("Sql 执行结束.....");
    }
}
  1. 创建 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");
    }
}
  1. Test 类:
public class Test {

    public static void main(String[] args) throws InterruptedException {
        // 真正使用的对象
        SqlService target = new SqlServiceImpl();
        // 代理对象
        SqlProxy sqlServiceProxy = new SqlProxy(target);
        // 执行代码
        sqlServiceProxy.executeSql();
    }
}
  1. 执行结果:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值