代理模式学习笔记
什么是代理?
代理是一种设计模式,用户可以通过代理操作,而真正去进行处理的是我们的目标对象,代理可以在方法增强(如:记录日志,添加事务,监控等)
拿一个例子说话。
Uservice.java
:接口,有个一保存用户的接口
public interface UserService {
void save();
}
实现类
public class UserServiceImpl implements UserService {
@Override
public void save() {
System.out.println("添加User");
}
}
如果现在提出一个需求,需要在Service方法上都要记录日志。那常规做法就是在方法上加上记录日志的逻辑。
public class UserServiceProxy implements UserService {
@Override
public void save() {
System.out.println("开启日志--");
System.out.println("添加User");
}
}
但是这样,如果接口有很多方法。那就要每一个方法都要去添加这段逻辑。
这个时候就需要请我们的代理来做了,用户通过代理去调用方法,代理就去找目标方法去做事
public class UserServiceProxy implements UserService {
private UserService target;
public UserServiceProxy(UserService target) {
this.target = target;
}
public void save(){
System.out.println("开启日志");
target.save();
}
}
public class Main {
public static void main(String[] args) {
UserServiceProxy userServiceProxy = new UserServiceProxy(new UserServiceImpl());
userServiceProxy.save();
}
}
这样在使用的时候直接传入我们的目标对象给代理,就能每一个方法都能记录日志,其实这个就是静态代理,代理分为静态代理和动态代理两种。静态代理的特点就是要实现接口
,如果接口后面要进行拓展修改,就需要我们去手动修改代理对象的方法。
所以这时候就需要动态代理了。
静态代理
上面以及介绍了静态代理了
动态代理
动态代理的特定就是不需要实现接口,但是需要使用JDK的api,用到里面的Proxy
Proxy.newProxyInstance()
参数1
ClassLoader
:类装载器参数2
interfaces
:代理类的接口参数3
InvocationHandler
:方法调用执行器
将上述类中方法用动态代理的方式改写
public class UserServiceProxy{
UserService userService = new UserServiceImpl();
public UserService getInstant(){
return (UserService)Proxy.newProxyInstance(UserServiceProxy.class.getClassLoader(), userService.getClass().getInterfaces(),
new InvocationHandler() {
/**
* @param proxy 代理对象 --- UserServiceProxy
*
* @param method 代理对象调用的方法
*
* @param args 方法参数
*
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开启日志--");
return method.invoke(userService, args);
}
});
}
}
调用处:
public class Main {
public static void main(String[] args) {
UserServiceProxy userServiceProxy = new UserServiceProxy();
UserService proxyInstant = userServiceProxy.getInstant();
proxyInstant.save();
}
}
运行结果: