设计模式之职责链模式

266 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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();
    }

}