行为型(四) - 责任链模式

本文详细介绍了责任链模式,包括其原理(解耦请求处理)、两种实现方式(链表与数组存储处理器)、抽象类设计以及示例代码,展示了如何通过链式结构传递请求直至找到能处理的处理器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念

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

二、实现

具体的实现方式有两种,用链表存储处理器和用数组存储处理器。

  • 用链表存储处理器

1、问题处理抽象类

public abstract class QuestionHandler {
    private QuestionHandler nextHandler;
    
    public void setNextHandler(QuestionHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    //使用模板模式将该方法设置为final,这样避免子类实现的时候忘记调用nextHandler.handleQuestion();
    public final void handleQuestion() {
        boolean isHandled = doHandle();
        if (!isHandled && nextHandler != null) {
            nextHandler.handleQuestion();
        }
    }
  
    public abstract boolean doHandle();
}

2、问题处理实现类

public class QuestionHandlerA extends QuestionHandler {
    @Override
    public boolean doHandle() {
        System.out.println("QuestionHandlerA - doHandle");
        return false;
    }
}

public class QuestionHandlerB extends QuestionHandler {
    @Override
    public boolean doHandle() {
        System.out.println("QuestionHandlerB - doHandle");
        return true;
    }
}

public class QuestionHandlerC extends QuestionHandler {
    @Override
    public boolean doHandle() {
        System.out.println("QuestionHandlerC - doHandle");
        return false;
    }
}

3、测试类

public class Client {
    public static void main(String[] args) {
        QuestionHandlerA handlerA = new QuestionHandlerA();
        QuestionHandlerB handlerB = new QuestionHandlerB();
        QuestionHandlerC handlerC = new QuestionHandlerC();

        handlerA.setNextHandler(handlerB);
        handlerB.setNextHandler(handlerC);
        handlerA.handleQuestion();
    }
}
  • 用数组存储处理器

1、在上面代码的基础上加一个QuestionHandlerChain类来保存所有处理器。

public class QuestionHandlerChain {
    List<QuestionHandler> handlers = new ArrayList<>();

    public void addQuestionHandler(QuestionHandler handler) {
        if (handler != null && !handlers.contains(handler)) {
            handlers.add(handler);
        }
    }

    public void startHandleQuestion() {
        for (QuestionHandler handler : handlers) {
            boolean isHandled = handler.doHandle();
            if (isHandled){
                break;
            }      
        }
    }
}

2、测试类

public class Client {
    public static void main(String[] args) {
        QuestionHandlerA handlerA = new QuestionHandlerA();
        QuestionHandlerB handlerB = new QuestionHandlerB();
        QuestionHandlerC handlerC = new QuestionHandlerC();

        QuestionHandlerChain chain = new QuestionHandlerChain();
        chain.addQuestionHandler(handlerA);
        chain.addQuestionHandler(handlerB);
        chain.addQuestionHandler(handlerC);
        chain.startHandleQuestion();
    }
}

3、运行结果
责任链模式结果.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值