JDK动态代理实现责任链模式

当一个对象在一条链上被多个拦截器拦截处理(拦截器也可以选择不拦截它)时,把这种设计模式称为责任链模式,它用于一个对象在多个角色中传递的场景。

依据上一篇文章中创建的拦截器接口,创建三个拦截器对象

public class Interceptor1 implements Interceptor{

	@Override
	public boolean before(Object proxy, Object target, Method method, Object[] args) {
		System.out.println("拦截器1的before方法");
		return true;
	}

	@Override
	public void around(Object proxy, Object target, Method method, Object[] args) {
		
	}

	@Override
	public void after(Object proxy, Object target, Method method, Object[] args) {
		System.out.println("拦截器1的after方法");
	}

}
public class Interceptor2 implements Interceptor {

	/* (non-Javadoc)
	 * @see interceptor.Interceptor#before(java.lang.Object, java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
	 */
	@Override
	public boolean before(Object proxy, Object target, Method method, Object[] args) {
		System.out.println("拦截器2的before方法");
		return true;
	}

	/* (non-Javadoc)
	 * @see interceptor.Interceptor#around(java.lang.Object, java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
	 */
	@Override
	public void around(Object proxy, Object target, Method method, Object[] args) {
	}

	/* (non-Javadoc)
	 * @see interceptor.Interceptor#after(java.lang.Object, java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
	 */
	@Override
	public void after(Object proxy, Object target, Method method, Object[] args) {
		System.out.println("拦截器2的after方法");
	}

}
public class Interceptor3 implements Interceptor{

	/* (non-Javadoc)
	 * @see interceptor.Interceptor#before(java.lang.Object, java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
	 */
	@Override
	public boolean before(Object proxy, Object target, Method method, Object[] args) {
		System.out.println("拦截器3的before方法");
		return true;
	}

	/* (non-Javadoc)
	 * @see interceptor.Interceptor#around(java.lang.Object, java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
	 */
	@Override
	public void around(Object proxy, Object target, Method method, Object[] args) {
	}

	/* (non-Javadoc)
	 * @see interceptor.Interceptor#after(java.lang.Object, java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
	 */
	@Override
	public void after(Object proxy, Object target, Method method, Object[] args) {
		System.out.println("拦截器3的after方法");
	}

}

实现责任链模式的逻辑

public class InterceptorJdkProxy implements InvocationHandler {

	private Object target;//真实对象
	private String interceptorClass = null;//拦截器全限定类名
	
	public InterceptorJdkProxy(Object target, String interceptorClass) {
		this.target = target;
		this.interceptorClass = interceptorClass;
	}
	
	public static Object bind(Object target,String interceptorClass) {
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InterceptorJdkProxy(target, interceptorClass));
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		if(interceptorClass == null) {
			return method.invoke(proxy, args);
		}else {
			Object result = null;
			Interceptor interceptor = (Interceptor) Class.forName(interceptorClass).newInstance();
			if(interceptor.before(proxy, target, method, args)) {
				result = method.invoke(target, args);
			}else {
				interceptor.around(proxy, target, method, args);
			}
			//调用后置方法
			interceptor.after(proxy, target, method, args);
			return result;
		}
	}
	
	public static void main(String[] args) {
		HelloWorld proxy1 = (HelloWorld) InterceptorJdkProxy.bind(new HelloWorldImpl(), "interceptor.Interceptor1");
		HelloWorld proxy2 = (HelloWorld) InterceptorJdkProxy.bind(proxy1, "interceptor.Interceptor2");
		HelloWorld proxy3 = (HelloWorld) InterceptorJdkProxy.bind(proxy2, "interceptor.Interceptor3");
		proxy3.sayHelloWorld();
	}

}

执行结果如下:

拦截器3的before方法
拦截器2的before方法
拦截器1的before方法
Hello World!
拦截器1的after方法
拦截器2的after方法
拦截器3的after方法

可以看到拦截器中的方法执行顺序:before方法按照从最后一个拦截器到第一个拦截器的顺序运行,而after则按照拦截器调用的顺序运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值