【GOF】代理模式之動態代理

    上一篇文章中介紹了靜態代理的實現和各個要點,最後提到了靜態代理的弊端和不足,這篇文章將會在其基礎之上介紹一下代理模式中的動態代理,也是對靜態代理的補充和完善!

    動態代理解決了靜態代理中需要挨個寫每個方法中的實現,而且很大程度上,都是重複性的代碼,所以我們需要通過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代理對象的加入可能會造成請求的處理速度變慢;

    各種模式的使用就是對前人智慧的學習,“前人栽樹,後人乘涼”,理解了其中的精髓和思想,以期將來可以爲這個行業做出自己的貢獻!

發佈了112 篇原創文章 · 獲贊 104 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章