行为型模式之责任链模式(Chain of Responsibility)

责任链模式的思想是在建立“一条处理链”,使得链上的所有处理者都有机会进行处理


责任链在内存中的形态是一层层的线程调用栈帧(线程frame存储在线程栈stack内),看上去就像一根常常的链条,通常并不知道链条上有多少个环(处理者),每个处理者负责的事情(责任)不同,他们自行判断是否可以处理,如果可以处理则自己处理(不传递到下一个),如果自己不能处理则传递给下一个处理者。

责任链模式的实现通常有一个抽象类,他模板化了处理机制(即:检查是否可以处理、可以则自己处理、不可以则传递给下一个、如果下一个为空则抛出异常等)

PS:责任链上一次都应该只有一个处理者能够处理,而不是每个处理者都依次处理一遍,当然这个没有技术要求,我们完全可以使用其变体实现多处理者处理、过滤器等效果。


责任链只是给他们处理的机会而已,而具体的处理者是否需要处理或是否有能力进行处理都由处理者自己控制,并且,自主控制是否传递到下一个链进行处理


责任链模式使请求与对请求的处理松耦合,使得添加新的处理以及定制处理次序变简单清晰。

使用责任链模式可方便地实现可插拔的处理方式,另外,通过控制处理的过程,如在传递到下个处理器之前和之后作处理,可以实现请求前后的细粒度的控制

可以将责任链模式与“模板方法模式”结合使用以约束将一个请求沿着处理链进行处理


场景:web英语的请求处理过程中,对一个请求的处理包括:记录日志、协议处理、Servlet分发等等,也可以自定义新的处理器,

即处理方式是可插拔的,是用责任链模式非常合适。


设计:

示例代码:

package netty_ws;

interface HandlerChain {
    void setNext(HandlerChain next);
    HandlerChain getNext();

    /**
     * 这里可以 添加 处理需要的参数,如请求上下文:RequestContext
     *
     * void invoke(RequestContext rc);
     *
     */
    void invoke();
}
// 使用模板方法模式
abstract class AbstractHandlerChain implements HandlerChain {
    private HandlerChain next;

    public void setNext(HandlerChain next) {
        this.next = next;
    }
    public HandlerChain getNext() {
        return this.next;
    }
    public void invoke() {
        invokeMe();

        // 可添加 前置处理

        // 传递到下一个处理者
        if (getNext() != null) {
            getNext().invoke();
        }

        // 可添加 后置处理
    }
    // 需要子类实现
    protected abstract void invokeMe();
}
class ProtocolHandler extends AbstractHandlerChain {
    @Override
    protected void invokeMe() {
        System.out.println("处理协议...");
    }
}
class Logger extends AbstractHandlerChain {
    @Override
    protected void invokeMe() {
        if (new java.util.Random().nextBoolean()) {// todo: 自主判断是否需要记录日志
            System.out.println("需要记录日志,记录日志...");
        } else {
            System.out.println("不需要记录日志。");
        }
    }
}
class Dispatcher extends AbstractHandlerChain {
    @Override
    protected void invokeMe() {
        System.out.println("分派相应的Servlet处理...");
    }
}

/**
 * 测试:责任链
 */
public class Test {
    public static void main(String[] args) {
        HandlerChain protocolHandler = new ProtocolHandler();
        HandlerChain logger = new Logger();
        HandlerChain dispatcher = new Dispatcher();

        /**
         * 设置“链”上的处理次序,即:组装出一个“处理链”
         */
        protocolHandler.setNext(logger);
        logger.setNext(dispatcher);

        /**
         * 执行 第一个“链”,后面的链会自动被调用处理。
         */
        protocolHandler.invoke();
    }
}
输出:

处理协议...
需要记录日志,记录日志...
分派相应的Servlet处理...

PS:其实这并不是一个很合适的责任链模式代码示例,更像一个过滤器链,技术没有绝对,能解决问题就好,不过为了增加代码的可读性与可维护性,依然建议遵守不成文的“模式规定”。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值