代理模式 java
2018-10-01 本文已影响0人
iarchitect
代理模式: 为其他对象提供一种代理以控制对这个对象的访问。
代理模式主要有静态代理,动态代理,Cglib代理三种;
1静态代理
静态代理在使用时,需要定义接口或父类,被代理对象与代理对象一起实现相同的接口或者是继承相同的父类。
下面举例解释:
public interface IUserDAO {
void save();
}
public class UserDao implements IUserDAO {
@Override
public void save() {
System.out.println("-------保存数据---------");
}
}
public class UserDAOProxy implements IUserDAO{
private IUserDAO target;
public UserDAOProxy(IUserDAO iUserDAO){
this.target = iUserDAO;
}
@Override
public void save() {
System.out.println("保存方法开始");
target.save();
System.out.println("保存方法结束");
}
}
public class Test {
public static void main(String[] args) {
//目标对象
UserDao userDao = new UserDao();
//代理对象
UserDAOProxy userDAOProxy = new UserDAOProxy(userDao);
//执行代理方法
userDAOProxy.save();
}
}
运行结果:
image.png
总结:
优点:可以在不修改目标对象功能的前提下,对目标对象的功能进行扩展。
缺点:目标对象和代理对象要实现一样的接口,一旦接口发生改变,目标对象和代理对象都要进行维护。
2动态代理
代理对象的生成是利用JDK的API,动态的在内存中构建代理对象。
代码示例:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
//维护一个目标对象
private Object target;
public ProxyFactory(Object target){
this.target = target;
}
//给目标对象生成代理对象
public Object getProxyInstace(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("保存方法开始。。。");
Object returnValue = method.invoke(target,args);
System.out.println("保存方法结束。。。");
return returnValue;
}
}
);
}
}
public class Test {
public static void main(String[] args) {
//目标对象
UserDao target = new UserDao();
//在内存中动态生成代理对象
IUserDAO proxy = (IUserDAO) new ProxyFactory(target).getProxyInstace();
proxy.save();
}
}
运行结果:
image.png
总结:
代理对象不需要实现接口,而目标对象需要实现接口。
3 Cglib代理
对一个没有实现任何接口的单独对象,实现代理的方式叫做Cglib代理
需要引入第三方jar
image.png
代码示例:
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class ProxyFactoryCglib implements MethodInterceptor {
//维护一个目标对象
private Object target;
public ProxyFactoryCglib(Object target){
this.target = target;
}
//给目标对象生成代理对象
public Object getProxyInstace(){
//1 工具类
Enhancer enhancer = new Enhancer();
//2 设置父类
enhancer.setSuperclass(target.getClass());
//3 设置回调函数
enhancer.setCallback(this);
//4 创建子类(代理对象)
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("保存数据开始。。。");
Object returnValue = method.invoke(target,objects);
System.out.println("保存数据结束。。。");
return returnValue;
}
}
public class Test {
public static void main(String[] args) {
//目标对象
UserDao target = new UserDao();
//生成代理对象
UserDao proxy = (UserDao) new ProxyFactoryCglib(target).getProxyInstace();
//执行代理对象方法
proxy.save();
}
}
运行结果:
image.png