代理模式的概念
通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能
代理的三种模式
静态代理
代理对象和被代理类有一个共同的抽象类或者接口,通过相同的方法调用被代理类的方法
代码示例:
// IUser.java
/**
* 用户接口
* Created by Demon-HY on 2018/3/26 0026.
*/
public interface IUser {
/**
* 删除用户
* @param userId 用户ID
* @return 返回删除的用户信息
*/
Map<String, Object> deleteUser(Long userId);
}
// User.java
/**
* 用户接口实现类,也是被代理类
* Created by Demon-HY on 2018/3/26 0026.
*/
public class User implements IUser {
@Override
public Map<String, Object> deleteUser(Long userId) {
return null;
}
}
// UserProxy.java
/**
* 用户代理类
* Created by Demon-HY on 2018/3/26 0026.
*/
public class UserProxy implements IUser {
private IUser target;
public UserProxy(IUser user) {
this.target = user;
}
@Override
public Map<String, Object> deleteUser(Long userId) {
System.out.println("删除用户前");
target.deleteUser(userId);
System.out.println("删除用户后");
return null;
}
}
// TestStaticProxy.java
/**
* 静态代理测试类
* Created by Demon-HY on 2018/3/26 0026.
*/
public class TestStaticProxy {
public static void main(String[] args) {
// 被代理类
User user = new User();
// 代理类
UserProxy userProxy = new UserProxy(user);
userProxy.deleteUser(1L);
}
}
静态代理优点:
在不修改原有代码的情况下增强功能,对方法进行扩展
静态代理缺点:
需要同时维护代理类和被代理类,维护成本很大,而且被代理对象多了就会导致代理类增多
动态代理
不提前生成对象的代理类,在需要用到的时候,通过反射动态生成代理类,我们不需要自己去实现动态代理类的生成方法,
Java JDK已经给我们提供了,包的所在路径:java.lang.reflect.Proxy,我们只需要继承 InvocationHandler就可以了
代码示例: