设计模式-责任链模式

一、简单责任链模式实现

图示:

 接口:

public interface Handler {
    Object handle(Object param);
    void addNext(Handler processor);
    Handler next();
}

实现类:

public class FirstHandler implements Handler {
    private Handler next=null;
    @Override
    public Object handle(Object param) {
        System.out.println(this.getClass().getName() + param);
        return param;
    }
    @Override
    public void addNext(Handler handler) {
        this.next = handler;
    }
    @Override
    public Handler next() {
        return next;
    }
}

使用方式:

Handler firstHandler = new FirstHandler();
Handler secondHandler = new SecondHandler();
Handler thirdHandler = new ThirdHandler();
firstHandler.addNext(secondHandler);
secondHandler.addNext(thirdHandler);

Handler tmpHandler=firstHandler;
while(tmpHandler!=null){
    tmpHandler.handle("");
    tmpHandler=tmpHandler.next();
}

优缺点:

实现了链式调用,严格保证了调用顺序和安全性,但无法进行链中断。

二、迭代器形式的责任链

类结构图示:

实现类(主要展示HandlerChain,其他类和接口比较简单自行实现):

private List<Handler> handlerChain = new ArrayList<>();
private volatile int index = 0;
public Boolean addHandler(Handler handler) {
    return handlerChain.add(handler);
}
public Handler currentHandler() {return handlerChain.get(index);}
public Object doHandlerChain(Object param) {
    Object result= param;
    Iterator<Handler> it = handlerChain.iterator();
    while (it.hasNext()){
        index++;
        Handler handler = it.next();
        result=handler.handle(result);
    }
    index = 0;
    return result;
}

使用:

HandlerChain chain = new HandlerChain();
Handler firstHandler = new FirstHandler();
Handler secondHandler = new SecondHandler();
Handler thirdHandler = new ThirdHandler();
chain.addHandler(firstHandler);
chain.addHandler(secondHandler);
chain.addHandler(thirdHandler);
Object result=chain.doHandlerChain("chain");
System.out.println(result);

结果输出:

优缺点:通过数组列表保存执行节点,可以比较容易的实现链式调用的中断,并且将节点和链式的执行进行了解耦。缺点是各个节点的执行不保证严格的顺序和安全性。

 三、类似拦截器形式的责任链,根据情况跳过某个节点执行。

图示:

 接口:

public interface Intercepter {
    Boolean beforeHandle(Object param);
    Object handle(Object param);
    Object afterhandle(Object param);
}

实现类:

public class FirstIntercepter implements Intercepter {

    @Override
    public Boolean beforeHandle(Object param) {
        System.out.println(this.getClass().getSimpleName() +"_beforeHandle");
        return true;
    }

    @Override
    public Object handle(Object param) {
        System.out.println(this.getClass().getName());
        return param + "_" + this.getClass().getSimpleName();
    }

    @Override
    public Object afterhandle(Object param) {
        System.out.println(this.getClass().getSimpleName() +"_afterhandle");
        return param;
    }
}

拦截器链实现(IntercepterChain):

public class IntercepterChain {

    private List<Intercepter> intercepterChain = new ArrayList<>();

    private volatile AtomicInteger index = new AtomicInteger();

    public Boolean addIntercepter(Intercepter intercepter) {
        return intercepterChain.add(intercepter);
    }

    public Intercepter currentIntercepter() {return intercepterChain.get(index.get());}

    public synchronized Object doIntercepterChain(Object param) {

        Iterator<Intercepter> it = intercepterChain.iterator();
        while (it.hasNext()){
            index.incrementAndGet();
            Intercepter intercepter = it.next();
            if (intercepter.beforeHandle(param)) {
                param=intercepter.handle(param);
                param=intercepter.afterhandle(param);
            }
        }
        index.set(0);
        return param;
    }
}

使用实例:

IntercepterChain chain = new IntercepterChain();
Intercepter firstIntercepter = new FirstIntercepter();
Intercepter secondIntercepter = new SecondIntercepter();
Intercepter thirdIntercepter = new ThirdIntercepter();
chain.addIntercepter(firstIntercepter);
chain.addIntercepter(secondIntercepter);
chain.addIntercepter(thirdIntercepter);
Object result=chain.doIntercepterChain("chain");
System.out.println(result);

优缺点:实现了链式调用,执行节点和链路管理进行了解耦,并且增加了拦截器前置和后置处理方法,同时可以任意跨过某个拦截器节点的执行;缺点是编写稍微复杂,安全性没有保证,没有严格的顺序要求。

原创文章,引用指明出处!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值