上一篇文章中介紹了靜態代理的實現和各個要點,最後提到了靜態代理的弊端和不足,這篇文章將會在其基礎之上介紹一下代理模式中的動態代理,也是對靜態代理的補充和完善!
動態代理解決了靜態代理中需要挨個寫每個方法中的實現,而且很大程度上,都是重複性的代碼,所以我們需要通過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代理對象的加入可能會造成請求的處理速度變慢;
各種模式的使用就是對前人智慧的學習,“前人栽樹,後人乘涼”,理解了其中的精髓和思想,以期將來可以爲這個行業做出自己的貢獻!