一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
定义
职责链模式的定义是:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。
在 GoF 给出的定义中,如果处理器链上的某个处理器能够处理这个请求,那就不会继续往下传递请求。实际上职责链模式还有一种变体,即每个处理器依次处理这个请求,直到所有的处理器都处理完为止。
在职责链模式中,多个处理器(也就是刚刚定义中说的“接收对象”)依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式。
应用场景
1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定,如Spring Interceptor,Servlet Filter等 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3、可动态指定一组对象处理请求。
类图
职责链模式常见的实现方式有两种:用链表存储处理器和用数组存储处理器。
链表方式
数组方式
代码实现
链表方式
AbstractHandler
public abstract class AbstractHandler {
protected AbstractHandler next = null;
public void setNext(AbstractHandler next) {
this.next = next;
}
// 因为每个 AbstractHandler 都要执行的 next.handle()
// 所以这里使用模板模式提取出来,让每个 AbstractHandler 专注于业务逻辑
public void handle() {
// 如果需要阻止后续的handler则需要返回一个boolean 值,
// 根据 boolean 值判断是否需要执行后面的handler
this.doHandle();
if (next != null) {
next.handle();
}
}
public abstract void doHandle();
}
AHandler
public class AHandler extends AbstractHandler {
@Override
public void doHandle() {
System.out.println("AHandler...");
}
}
BHandler
public class BHandler extends AbstractHandler {
@Override
public void doHandle() {
System.out.println("BHandler...");
}
}
HandlerChain
public class HandlerChain {
// 头节点
private AbstractHandler head = null;
// 尾结点
private AbstractHandler tail = null;
public void addHandler(AbstractHandler handler) {
handler.setNext(null);
// 如果头节点为null,说明第一次添加
if (head == null) {
head = handler;
tail = handler;
return;
}
// 头节点不为null,说明至少添加过一次
// 先把当前尾节点的next设置为handler,再更新尾节点
tail.setNext(handler);
tail = handler;
}
public void handle() {
if (head != null) {
head.handle();
}
}
}
Main
public class Main {
public static void main(String[] args) {
HandlerChain chain = new HandlerChain();
chain.addHandler(new AHandler());
chain.addHandler(new BHandler());
chain.handle();
}
}
数组方式
AbstractHandler
public abstract class AbstractHandler {
public abstract void doHandle();
}
AHandler
public class AHandler extends AbstractHandler {
@Override
public void doHandle() {
System.out.println("AHandler...");
}
}
BHandler
public class BHandler extends AbstractHandler {
@Override
public void doHandle() {
System.out.println("BHandler...");
}
}
HandlerChain
public class HandlerChain {
private final List<AbstractHandler> handlers = new ArrayList<>();
public void addHandler(AbstractHandler handler) {
this.handlers.add(handler);
}
public void handle() {
for (AbstractHandler handler : handlers) {
// 如果需要截止则需要返回一个boolean 值,
// 根据boolean 值判断是否需要执行后面的handler
handler.doHandle();
}
}
}
Main
public class Main {
public static void main(String[] args) {
HandlerChain chain = new HandlerChain();
chain.addHandler(new AHandler());
chain.addHandler(new BHandler());
chain.handle();
}
}