问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

责任链模式详解:概念、实现与应用场景

创作时间:
作者:
@小白创作中心

责任链模式详解:概念、实现与应用场景

引用
CSDN
1.
https://blog.csdn.net/wind_chasing_boy/article/details/137025834

责任链模式是一种常用的行为型设计模式,它允许将多个处理对象串联成一条链,每个对象都有机会处理请求。如果当前对象无法处理请求,则将其传递给链中的下一个对象。这种模式在许多场景中都有应用,如多级审批流程、事件处理等。本文将通过一个在线订购系统的案例,详细讲解责任链模式的概念、实现原理及其优缺点。

问题描述

假设你正在开发一个在线订购系统,需要对系统访问进行限制:

  • 只允许认证用户创建订单
  • 拥有管理权限的用户可以访问所有订单

简单规划后,你会意识到这些检查必须依次进行:

  1. 首先尝试对用户进行认证
  2. 如果认证失败,则无需进行后续检查

随着时间的推移,系统面临了新的挑战:

  • 需要防范暴力密码破解攻击
  • 需要清理请求中的数据以确保安全
  • 需要实现缓存机制以提高响应速度

随着代码的迭代,系统变得越来越复杂,维护成本激增。因此,决定对整个系统进行重构。

解决方案

在重构后的系统中,每个处理器在处理完请求后,会决定是否将请求传递给下一个处理器。只有当请求包含正确的数据时,所有处理器才会执行自己的主要行为,包括身份验证和数据缓存等。

结构

责任链模式主要包含以下两个角色:

  • 抽象处理器(Handler):定义处理请求的接口,并持有下一个处理器的引用。
  • 具体处理器(Concrete Handler):实现处理请求的具体逻辑,并决定是否将请求传递给下一个处理器。

示例代码

下面是一个简单的责任链模式示例:

在这个示例中:

  • Handler 是抽象处理器
  • ConcreteHandler1ConcreteHandler2 是具体处理器

客户端将请求发送给第一个处理器,处理器链中的每个处理器根据自己的逻辑来决定是否处理请求或将请求传递给下一个处理器。

// 抽象处理器
abstract class Handler {
    protected Handler nextHandler; // 下一个处理器
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }
    public abstract void handleRequest(int request); // 处理请求的抽象方法
}
// 具体处理器1
class ConcreteHandler1 extends Handler {
    public void handleRequest(int request) {
        if (request >= 0 && request < 10) {
            System.out.println("ConcreteHandler1 handles request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request); // 将请求传递给下一个处理器
        }
    }
}
// 具体处理器2
class ConcreteHandler2 extends Handler {
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println("ConcreteHandler2 handles request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request); // 将请求传递给下一个处理器
        }
    }
}
// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 构建处理器链
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        handler1.setNextHandler(handler2);
        // 发送请求
        handler1.handleRequest(5);
        handler1.handleRequest(15);
        handler1.handleRequest(25);
    }
}

优点

  • 解耦性增强:请求发送者和接收者之间的解耦,请求发送者不需要知道具体的处理者,处理者也不需要知道请求的发送者。
  • 灵活性提高:可以动态地调整链中处理器的顺序,灵活地改变请求的处理流程。
  • 可扩展性增加:可以很容易地增加新的处理器来处理新的请求类型。

缺点

  • 性能问题:处理请求时可能需要遍历整个链,可能会影响性能。
  • 请求未被处理:如果没有处理器能够处理请求,则请求会被丢弃,可能会造成请求未被处理的情况。

应用场景

  • 多级审批流程:如请假审批、报销审批等流程。
  • 事件处理:如GUI事件处理、日志处理等。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号