代理模式

定义

给某一个对象提供一个代理,并由代理对象来控制对真实对象的访问。

代理模式可以分为3个角色:

  1. Interface:定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法
  2. Implement:真正实现业务逻辑的类
  3. Proxy:用来代理和封装真实主题

代理模式使用场景来分类,至少可以分为以下几类:

  1. 远程代理
  2. 虚拟代理
  3. Copy-on-Write 代理。
  4. 保护(Protect or Access)代理
  5. Cache代理
  6. 防火墙(Firewall)代理
  7. 同步化(Synchronization)代理
  8. 智能引用(Smart Reference)代理等等

静态代理和动态代理

如果根据字节码的创建时机来分类,可以分为静态代理和动态代理:

  • 所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和真实主题角色的关系在运行前就确定了。
  • 而动态代理的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以在运行前并不存在代理类的字节码文件

静态代理

//Interface
public interface UserService {
    public void select();   
    public void update();
}
//Implement
public class UserServiceImpl implements UserService {  
    public void select() {  
        System.out.println("查询 selectById");
    }
    public void update() {
        System.out.println("更新 update");
    }
}
//Proxy
public class UserServiceProxy implements UserService {
    private UserService target; // 被代理的对象

    public UserServiceProxy(UserService target) {
        this.target = target;
    }
    public void select() {
        before();
        target.select();    // 这里才实际调用真实主题角色的方法
        after();
    }
    public void update() {
        before();
        target.update();    // 这里才实际调用真实主题角色的方法
        after();
    }

    private void before() {     // 在执行方法之前执行
        System.out.println(String.format("log start time [%s] ", new Date()));
    }
    private void after() {      // 在执行方法之后执行
        System.out.println(String.format("log end time [%s] ", new Date()));
    }
}

//使用
UserService userServiceImpl = new UserServiceImpl();
UserService proxy = new UserServiceProxy(userServiceImpl);
proxy.select();
proxy.update();

通过这种方式扩展对象的功能,这种设计模式称为代理模式。

动态代理

参考文章

  1. 深入理解Java动态代理
posted @ 2023-06-14 12:15  Ysun_top  阅读(28)  评论(0)    收藏  举报