责任链模式:原理与实现解析,及其应用场景代入

责任链模式的作用:复用和扩展,在实际的项目开发中比较常用,特别是框架开发中,我们可以利用它们来提供框架的扩展点,能够让框架的使用者在不修改框架源码的情况下,基于扩展点定制化框架的功能。

这里主要介绍解责任链模式的原理和实现。另外,还会基于责任链模式,实现一个可以灵活扩展算法的敏感词过滤框架。

责任链模式的原理和实现

责任链模式的英文翻译是Chain Of Responsibility Design Pattern。在GoF的《设计模式》中,它是这么定义的:

Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.

翻译成中文就是:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

这么说比较抽象,我用更加容易理解的话来进一步解读一下。

在责任链模式中,多个处理器(也就是刚刚定义中说的“接收对象”)依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理器处理完后再传递给C处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理责任,所以叫作责任链模式。

关于责任链模式,我们先来看看它的代码实现。结合代码实现,你会更容易理解它的定义。责任链模式有多种实现方式,我们这里介绍两种比较常用的。

第一种实现方式如下所示。其中,Handler是所有处理器类的抽象父类,handle()是抽象方法。每个具体的处理器类(HandlerA、HandlerB)的handle()函数的代码结构类似,如果它能处理该请求,就不继续往下传递;如果不能处理,则交由后面的处理器来处理(也就是调用successor.handle())。HandlerChain是处理器链,从数据结构的角度来看,它就是一个记录了链头、链尾的链表。其中,记录链尾是为了方便添加处理器。

public abstract class Handler {
   
  protected Handler successor = null;

  public void setSuccessor(Handler successor) {
   
    this.successor = successor;
  }

  public abstract void handle();
}

public class HandlerA extends Handler {
   
  @Override
  public void handle() {
   
    boolean handled = false;
    //...
    if (!handled && successor != null) {
   
      successor.handle();
    }
  }
}

public class HandlerB extends Handler {
   
  @Override
  public void handle() {
   
    boolean handled = false;
    //...
    if (!handled && successor != null) {
   
      successor.handle();
    } 
  }
}

public class HandlerChain {
   
  private Handler head = null;
  private Handler tail = null;

  public void addHandler(Handler handler) {
   
    handler.setSuccessor(null);

    if (head == null) {
   
      head = handler;
      tail = handler;
      return;
    }

    tail.setSuccessor(handler);
    tail = handler;
  }

  public void handle() {
   
    if (head != null) {
   
      head.handle();
    }
  }
}

// 使用举例
public class Application {
   
  public static void main(String
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值