「手写设计模式」责任链模式

588 阅读2分钟

理解名词

责任链模式(Chain Of Responsibility Design Pattern)是一种行为型设计模式,责任在这里理解为“应该做的事情”,结合链来理解就是,多个处理器以链式结构顺序组织起来,依次对同一个请求执行该处理器应该做的事情。

在GoF《设计模式》中,定义如下:

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

作用

复用扩展

在框架开发中,我们可以利用它们来提供框架的扩展点,能够让框架的使用者在不修改框架源码的情况下,基于扩展点定制化框架的功能。

适用场景

过滤器,拦截器,工作流编排。例如Servlet Filter, Spring Interceptor, Netty ChanelHandler

应用场景举例:

  • UGC应用(论坛,微博)敏感词过滤,实现多个处理器分别对涉黄词,广告,反动词汇进行处理(用****替换敏感词)
  • 对 HTTP 请求的过滤功能,比如鉴权、限流、记录日志、验证参数等
  • 对 HTTP 请求进行路由分发。

代码示例

责任链由两个部分组成,Handler类以及HandlerChain类

Handler类

// 首先定义Handler接口
public interface IHander {
	boolean handle(); 
}

// Handler实现类定义
public class HandlerA implements IHandler {
	@Override
  public boolean handle() {
  	boolean handled = false;
    // 处理逻辑
    return handled;
  }
}

// Handler实现类定义
public class HandlerB implements IHandler {
	@Override
  public boolean handle() {
  	boolean handled = false;
    // 处理逻辑
    return handled;
  }
}

// Handler实现类定义
public class HandlerC implements IHandler {
	@Override
  public boolean handle() {
  	boolean handled = false;
    // 处理逻辑
    return handled;
  }
}

HandlerChain类

public class HandlerChain {
 	private List<IHandler> handlers = new ArrayList<>();
  
  public void addHandler(IHandler handler) {
  	 this.handlers.add(handler);
  }
  
  // 模式一:被其中一个处理器处理之后,该处理器之后的处理器无需处理该请求。
  public void handle() {
   	for(IHandler handler: handlers) {
     	boolean handled = handler.handle();
      if (handled) {
      	break;
      }
    }
  }
  
  // 模式二:一个请求将被每一个处理器处理一次
  public void handle() {
   	for(IHandler handler: handlers) {
     	handler.handle();
    }
  }
}

使用举例

public class Application {
 public static void main(String[] args) {
   HandlerChain chain = new HandlerChain();
   chain.addHandler(new HandlerA());
   chain.addHandler(new HandlerB());
   chain.addHandler(new HandlerC());
   chain.handle();
 }
}

业界经典实现

  • Servlet Filter
  • Spring Interceptor