上一篇文章中介绍了静态代理的实现和各个要点,最后提到了静态代理的弊端和不足,这篇文章将会在其基础之上介绍一下代理模式中的动态代理,也是对静态代理的补充和完善!
动态代理解决了静态代理中需要挨个写每个方法中的实现,而且很大程度上,都是重复性的代码,所以我们需要通过InvocationHandler接口来简化此过程。
动态代理结构图:
UserManager代码段:
public interface UserManager {
public void addUser(String userId,String userName);
public void delUser(String userId);
public void modifyUser(String userId,String userName);
public String findUser(String userId);
}
UserManagerImpl代码段:
public class UserManagerImpl implements UserManager {
@Override
public void addUser(String userId, String userName) {
System.out.println("addUser() userid=" + userId);
}
@Override
public void delUser(String userId) {
System.out.println("delUser() userid=" + userId);
}
@Override
public void modifyUser(String userId, String userName) {
System.out.println("modifyUser() userid=" + userId);
}
@Override
public String findUser(String userId) {
System.out.println("findUser() userid=" + userId);
return null;
}
}
LogHandler代码段:
public class LogHandler implements InvocationHandler {
private Object targetObject;
public Object newProxyInstance(Object targetObject) {
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("start-" + method.getName());
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
Object ret = null;
// 调用目标方法
method.invoke(targetObject, args);
System.out.println("success->" + method.getName());
return null;
}
}
Client代码段:
public class Client {
public static void main(String[] args) {
LogHandler logHandler = new LogHandler();
UserManager userManager = (UserManager) logHandler
.newProxyInstance(new UserManagerImpl());
userManager.addUser("1200", "zhangsan");
}
}
输出结果:这样便在InvocationHandler控制器中实现了接口方法的封装,而无需再在各个方法中去做具体的实现,提高了灵活性。需要注意的是InvocationHandler控制器中通过反射会降低系统的性能,但是系统的可维护性和复用性都得到了很高的提升,所以还是很值得借鉴的!
优点:
·1职责清晰;
·2高拓展性;
·3智能化;
缺点:
·1代理对象的加入可能会造成请求的处理速度变慢;
各种模式的使用就是对前人智慧的学习,“前人栽树,后人乘凉”,理解了其中的精髓和思想,以期将来可以为这个行业做出自己的贡献!