代理模式
通过代理对象访问目标对象
可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
静态代理
静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者继承相同的父类。
代码示例
接口代码
public interface IUserDao {
void save();
}
目标对象代码
public class UserDao implements IUserDao {
public void save() {
System.out.println("--保存数据--");
}
}
代理对象代码
public class UserDaoProxy implements IUserDao {
// 接收保存目标对象
private IUserDao target;
public UserDaoProxy(IUserDao target) {
this.target = target;
}
public void save() {
System.out.println("--开始事务--");
// 执行目标对象的方法
target.save();
System.out.println("--提交事务--");
}
}
测试类代码
public class Test {
public static void main(String[] args) {
// 目标对象
IUserDao target = new UserDao();
// 代理对象
UserDaoProxy proxy = new UserDaoProxy();
// 执行代理方法
proxy.save();
}
}
总结
静态代理,可以做到不修改目标对象的功能前提下,对目标功能扩展。
因为代理对象需要与目标实现一样的接口,所有在代理类,类太多。
当接口有太多方法时,代理类要实现的方法太多。
一旦接口增加了方法,目标对象与代理对象都要维护,实现。
动态代理
动态代理在使用时,不需要实现接口
代理对象的生成,利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
动态代理也叫做JDK代理、接口代理
JDK中生成代理对象的API
代理类所在的包:java.lang.Proxy
JDK实现代理只需要使用newProxyInstance方法
static Object newProxyInstance(ClassLoader loader, Class<?> interfaces, InvocationHandler h)