代理模式 - 动态

接着说代理模式。 动态代理就是让程序在运行是自动去找代理。

客户端代码
public class Client {
	public static void main(String[] args) {
		// 被代理人登场
		Killer killer = new NailsKiller();

		// 代理登场
		Killer proxy = NailsKillerProxy.newInstance(killer);

		// 执行
		proxy.setTarget("钉子户");
		proxy.kill();
	}
}


钉子户杀手NailsKiller没什么变化, 只是Killer的一个简单的实现
public class NailsKiller implements Killer {

	private String target;

	@Override
	public void setTarget(String target) {
		this.target = target;
		System.out.println(this.target + " 已经被锁定");
	}

	@Override
	public void kill() {
		System.out.println(this.target + " 被干掉了");
	}
}


再来看看Handler
public class NailsKillerInvocationHandler implements InvocationHandler {

	private Killer killer;

	public NailsKillerInvocationHandler(Killer killer) {
		this.killer = killer;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		return method.invoke(this.killer, args);
	}
}


通用的动态代理类
public class DynamicProxy<T> {

	@SuppressWarnings("unchecked")
	public static <T> T newInstance(ClassLoader loader, Class<?>[] interfaces,
			InvocationHandler handler) {
		return (T) Proxy.newProxyInstance(loader, interfaces, handler);
	}
}


具体的钉子户杀手动态代理类
public class NailsKillerProxy extends DynamicProxy {
	public static <T> T newInstance(Killer killer) {
		ClassLoader loader = killer.getClass().getClassLoader();
		Class<?>[] clazz = killer.getClass().getInterfaces();
		InvocationHandler handler = new NailsKillerInvocationHandler(killer);

		return newInstance(loader, clazz, handler);
	}
}


运行结果完全一样:
引用
钉子户 已经被锁定
钉子户 被干掉了


唯一的问题就是怎样把AOP应用到里面去, 比如在本例中我想实现一个当“钉子户"被锁定的时候需要给被代理人发一条消息。 这个怎样弄呢??? 大牛们给点意见。。。

猜你喜欢

转载自vrplat.iteye.com/blog/1101079