【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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章