上一篇文章中介绍了静态代理的实现和各个要点,最后提到了静态代理的弊端和不足,这篇文章将会在其基础之上介绍一下代理模式中的动态代理,也是对静态代理的补充和完善!
动态代理解决了静态代理中需要挨个写每个方法中的实现,而且很大程度上,都是重复性的代码,所以我们需要通过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代理对象的加入可能会造成请求的处理速度变慢;
各种模式的使用就是对前人智慧的学习,“前人栽树,后人乘凉”,理解了其中的精髓和思想,以期将来可以为这个行业做出自己的贡献!