代理模式,侧重于对某一事物的具体方面的实现,代理可能是对象本身,但代理和对象不完全相同
这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法
一,静态代理
- 可以做到在不修改目标对象的功能前提下,对目标功能扩展
- 因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多
- 同时,一旦接口增加方法,目标对象与代理对象都要维护
public class UserProxy implements IUserDao {
private IUserDao mUser;
public UserProxy(IUserDao user){
mUser = user;
}
@Override
public void add(User user) {
mUser.add(user);
}
@Override
public void delete(int id) {
mUser.delete(id);
}
@Override
public void update(int id) {
mUser.update(id);
}
@Override
public void quey(int id) {
mUser.quey(id);
}
}
二,动态代理
- 代理对象,不需要实现接口
- 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
- 动态代理也叫做:JDK代理,接口代理
- JDK中生成代理对象的API
- 代理类所在包:java.lang.reflect.Proxy
- 目标对象实现的接口的类型,使用泛型方式确认类型
- 使用了反射机制,对性能会造成影响
代码简单示例:
public class DynamicPorxy {
private Object target;
public DynamicPorxy(Object target) {
this.target = target;
}
//给目标对象生成代理对象给目标对象生成代理对象
public Object getProxyInstance() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object value = method.invoke(target, args);
return value;
}
});
}
}