代理者模式,就是你主要负责一系列功能,这时需要在每个功能前后做一些相同额外的事,这时就可以找一个代理,帮你做这些事 |
---|
就是你是搞发明创造的,造好东西去卖,记账这些就可以找个代理 |
有两种代理,静态和动态,静态就是你找个帮手帮你,动态就是复制一份你,然后做比你更多的事 |
废话不多说,接下来直接上代码 |
1、静态代理
静态代理有很多问题,比如我们原实现类新增加了方法,代理人也需要写相应代理实现,后期维护复杂,动态代理可以良好解决这个问题
2、动态代理
下面部分代码是为了帮你好理解,不推荐使用,先了解一下什么是动态代理,然后会有开发阶段的代码讲解 |
---|
下面是解耦合的,推荐在项目中使用的 |
---|
package com.company;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 实现动态代理,首先需要一个代理类,继承InvocationHandler接口
* 然后实现invoke方法,代理对象会执行这个方法
* 最后返回代理对象 Proxy.newProxyInstance(目标类加载器,目标类接口,代理类)
*/
public class UserServiceImplProxy implements InvocationHandler {//继承InvocationHandler接口
private Object object;//目标类对象(被代理对象,此代理对象可以是任何对象了)
public Object getProxy(Object object) {//代理方法,获取代理对象,我们需要通过这个代理对象来实现代理
this.object = object;//通过参数,获取不同的代理对象
//返回指定类的代理对象
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理");
method.invoke(object,args);//反射被代理对象,传入参数
System.out.println("动态代理完成");
return null;
}
}
package com.company;
/**
* 调用动态代理
*/
public class Main{
public static void main(String[] args) {
UserServiceImplProxy userServiceImplProxy = new UserServiceImplProxy();//创建动态代理者
UserService userService = (UserService)userServiceImplProxy.getProxy(new UserServiceImpl());//调用方法,获取代理对象
userService.addUser();//通过代理对象调用添加用户方法,实现代理
userService.updateUser();
}
}