我对代理模式的理解
工作中,公司祖传代码已经完成了所需功能,但是现在要求对所有的请求加日志。为了改动原有代码,避免出现不可预知的意外,就可以使用代理模式,也就是传说中的套娃娃。
代理的实现方式
首先来看基本需求
//service接口
public interface UserService {
void add(String name);
void delete();
void update();
void query();
}
//实现类
public class UserServiceImpl implements UserService {
@Override
public void add(String name) {
System.out.println("add方法"+name);
}
@Override
public void delete() {
System.out.println("delete方法");
}
@Override
public void update() {
System.out.println("update方法");
}
@Override
public void query() {
System.out.println("query方法");
}
}
//方法调用
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
userService.add("张三丰");
}
通过代理实现
添加代理类
//代理类
public class ProxyInvocationHandler implements InvocationHandler {
private Object interfaceimpl;
// 设置代理内容(原有对象)
public ProxyInvocationHandler(Object interfaceimpl) {
this.interfaceimpl = interfaceimpl;
}
// 生成代理对象
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), interfaceimpl.getClass().getInterfaces(), this);
}
// 通过反射调用代理内容的方法,并自定义增强内容
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法前增强");
Object invoke = method.invoke(interfaceimpl, args);
System.out.println("方法后增强");
return invoke;
}
}
//调用方法
public static void main(String[] args) {
//创建一个实现类,实现类里边的方法重写过才有意义,传接口没意义
UserServiceImpl userService = new UserServiceImpl();
//创建一个处理器,将实现类传给处理器,等待调用
ProxyInvocationHandler handler = new ProxyInvocationHandler(userService);
//获取处理器的代理对象,调用实现类的方法
UserService proxy = (UserService) handler.getProxy();
proxy.add("张三丰");
}
总结: 代理模式其实还是套娃娃,嵌套了一层ProxyInvocationHandler,
1.将原程序的实现类传给ProxyInvocationHandler,生成一个代理的对象(用来调用增强后的方法)
2.重写invoke方法,通过mothod.invoke()保留原有的功能之外,自定义一些其他的功能
3.通过生成的代理对象调用已经增强过的方法,实现方法的增强
所写内容为个人理解,仅为个人学习记录,肯定有不对的地方,不作为大家参考