责任链模式的理解与实例

10 篇文章 0 订阅

当一个对象在一条链上把多个拦截器处理时,我们把这种设计模式称为责任链模式。责任链模式 同样是对jdk动态代理的应用。如何编写一个简单的责任链实例?
首先定义Interceptor接口
该接口规定了在调用目的方法之前的处理,同时返回boolean代表是否调用目的方法。 还有调用之后的方法处理。
定义接口后便可以加入自己想要的实现了。这里可以有多个实现从而可以对同一个对象的一个方法进行多次拦截。那么这个过程还没写 怎么实现呢?答案是:动态代理
你应该书写这样一个类:该类实现InvocationHandler接口,实现其invoke方法,同时定义类变量 1、被代理对象 2、拦截器的name(全限定名)。同时定义绑定方法(即把被代理对象绑定到代理对象上)bind(Object target,String interceptorClazz)返回代理对象。类似Proxy.newInstance(classLoader,Interfaces,new ClassName(target,”拦截器的全限定名”));同时 在invoke方法中同时利用反射获取到 拦截器类,从而判断是否调用method.Invoke()以及加入拦截器的拦截方法。

public interface Interceptor {
    public boolean before(Object proxy, Object target, Method method, Object[] args);
    public void around(Object proxy, Object target, Method method, Object[] args);
    public void after(Object proxy, Object target, Method method, Object[] args);
}
public class MyInterceptor1 implements Interceptor {
    public boolean before(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("before interceptor 1..............");
        return true;
    }

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

    }

    public void after(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("after interceptor 1..............");
    }
}
public class MyIntercetor implements Interceptor {
    public boolean before(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("before interceptor 0..............");
        return true;
    }

    public void around(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("取消原有方法的逻辑");
    }

    public void after(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("after interceptor 0..............");
    }
}
public class JDKDynamicProxy implements InvocationHandler {
    public Object object;
    public String interceptorClazz;

    public JDKDynamicProxy(Object object, String interceptorClazz) {
        this.object = object;
        this.interceptorClazz = interceptorClazz;
    }

    public static Object bind(Object object,String interceptorClazz){
        return Proxy.newProxyInstance(object.getClass().getClassLoader(),
                object.getClass().getInterfaces(),
                new JDKDynamicProxy(object,interceptorClazz));

    }


    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        if(interceptorClazz==null){
            method.invoke(object,args);
        }
        Object result = null;
        Interceptor interceptor = (Interceptor) Class.forName(interceptorClazz).newInstance();
        if(interceptor.before(proxy,object,method,args)){
            result =  method.invoke(object,args);
        }else{
            interceptor.around(proxy,object,method,args);
        }
        interceptor.after(proxy,object,method,args);

        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值