代理模式
定义
给某一个对象提供一个代理,并由代理对象来控制对真实对象的访问。
代理模式可以分为3个角色:
- Interface:定义代理类和真实主题的公共对外方法,也是代理类代理真实主题的方法
- Implement:真正实现业务逻辑的类
- Proxy:用来代理和封装真实主题
代理模式使用场景来分类,至少可以分为以下几类:
- 远程代理
- 虚拟代理
- Copy-on-Write 代理。
- 保护(Protect or Access)代理
- Cache代理
- 防火墙(Firewall)代理
- 同步化(Synchronization)代理
- 智能引用(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();
通过这种方式扩展对象的功能,这种设计模式称为代理模式。

浙公网安备 33010602011771号