设计模式3-责任链模式

责任链模式 是一种行为设计模式 ,它允许你创建一个对象链。请求沿着这条链传递,直到有一个对象处理它为止。这种模式通常用于需要以某种方式动态地决定处理请求的顺序或方式的情况。

类图:

从图中可见最大的特点是AbstractHandler 它自己聚合了自己,也就是说AbstractHandler中又有一个AbstractHandler的成员属性。因为Java的实现就是用这种方式将所有Handler串成一条链。

时序图:

责任链模式包括以下主要组件:

1. 处理者(Handler)接口/抽象类

定义了处理请求的接口,通常包含一个处理请求的方法。具体的处理者(ConcreteHandler)实现该接口/抽象类,并负责处理请求,或者将请求传递给下一个处理者。

2. 具体处理者(ConcreteHandler)

实现了处理者接口/抽象类,并负责处理请求。如果它能够处理请求,则处理它;否则,将请求传递给下一个处理者。

3. 客户端(Client)

创建请求并将其发送到责任链的起始点。客户端不知道实际处理请求的对象是哪个,只需将请求发送到责任链即可。

责任链模式的优点包括:

  • 灵活性:可以动态地调整责任链的组织结构和顺序,以满足不同的需求。
  • 可扩展性:可以方便地添加新的处理者,而不影响现有的处理者和客户端代码。
  • 解耦性:请求发送者和请求处理者之间解耦,使得系统更易于维护和扩展。

一个简单的例子是,假设一个软件系统需要处理不同级别的问题(比如 Debug、Info、Warning、Error),每个级别对应一个处理者,它们按照严重程度的顺序组成责任链。当一个问题发生时,系统会将问题的级别传递给责任链的起始点,责任链会根据问题的级别逐级处理,直到找到合适的处理者。

代码:

java 复制代码
// 定义处理请求的接口
interface Handler {
    void handleRequest(String level);
}

// 具体处理者类
class DebugHandler implements Handler {
    @Override
    public void handleRequest(String level) {
        if (level.equals("Debug")) {
            System.out.println("Debug handler is handling the request.");
        } else {
            System.out.println("Debug handler cannot handle the request, passing to the next handler.");
        }
    }
}

class InfoHandler implements Handler {
    private Handler nextHandler;

    public InfoHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(String level) {
        if (level.equals("Info")) {
            System.out.println("Info handler is handling the request.");
        } else {
            System.out.println("Info handler cannot handle the request, passing to the next handler.");
            nextHandler.handleRequest(level);
        }
    }
}

class WarningHandler implements Handler {
    private Handler nextHandler;

    public WarningHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(String level) {
        if (level.equals("Warning")) {
            System.out.println("Warning handler is handling the request.");
        } else {
            System.out.println("Warning handler cannot handle the request, passing to the next handler.");
            nextHandler.handleRequest(level);
        }
    }
}

class ErrorHandler implements Handler {
    @Override
    public void handleRequest(String level) {
        if (level.equals("Error")) {
            System.out.println("Error handler is handling the request.");
        } else {
            System.out.println("Error handler cannot handle the request, it's the end of the chain.");
        }
    }
}

// 客户端类
public class Client {
    public static void main(String[] args) {
        // 创建责任链
        Handler debugHandler = new DebugHandler();
        Handler infoHandler = new InfoHandler(new WarningHandler(new ErrorHandler()));

        // 测试不同级别的请求
        debugHandler.handleRequest("Info");
        System.out.println("-----------------");
        infoHandler.handleRequest("Info");
        System.out.println("-----------------");
        infoHandler.handleRequest("Error");
    }
}

结果:

Debug handler cannot handle the request, passing to the next handler.


Info handler is handling the request.


Info handler cannot handle the request, passing to the next handler.

Warning handler cannot handle the request, passing to the next handler.

Error handler is handling the request.

应用场景:

责任链模式在实际应用中有许多使用场景,主要是在需要动态决定处理请求的顺序或方式的情况下。以下是一些常见的使用场景:

  1. 日志记录

在软件系统中,日志记录是一个常见的需求。责任链模式可以用于按照日志级别(如 Debug、Info、Warning、Error)的顺序处理日志消息,每个处理者负责记录特定级别的日志,如果某个处理者无法处理某个级别的日志,则将日志传递给下一个处理者。

  1. 请求过滤器

在 Web 开发中,可以使用责任链模式来实现请求过滤器链。每个过滤器负责执行一些特定的过滤逻辑,例如身份验证、日志记录、性能监控等,如果一个过滤器无法处理请求,则将请求传递给下一个过滤器。

  1. 事件处理

责任链模式也可以用于事件处理,其中每个处理者负责处理特定类型的事件。例如,图形用户界面中的事件处理可以构成责任链,其中每个组件都可以处理特定类型的事件,如果一个组件无法处理事件,则将事件传递给其父组件。

  1. 权限验证

在安全领域,责任链模式可以用于实现权限验证机制。每个处理者可以检查用户的权限,并决定是否允许执行特定操作,如果一个处理者无法确定用户的权限,则将请求传递给下一个处理者。

  1. 订单处理

在电子商务系统中,订单处理是一个复杂的过程,涉及到库存管理、支付处理、物流等。责任链模式可以用于将订单处理流程分解为多个处理者,每个处理者负责处理特定阶段的订单处理,如果一个处理者无法处理订单,则将订单传递给下一个处理者。

这些只是责任链模式的一些常见应用场景,实际上,责任链模式可以用于许多不同的领域和情景,只要存在一系列对象,每个对象都有可能处理请求,并且请求需要按照一定顺序传递。

结论:

责任链模式使用广泛 ,很常见。责任链模式的关键思想是将请求发送者和请求处理者解耦 ,每个处理者只关心自己能否处理请求,而不关心请求的具体内容或下一个处理者是谁。

相关推荐
灿飞7 分钟前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
计算机毕设定制辅导-无忧学长16 分钟前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
雪芽蓝域zzs1 小时前
第 1 章:IDEA 创建 SpringBoot3.5.16 Maven 项目
java·maven·intellij-idea
golang学习记1 小时前
IDEA 开始换芯,发布全新AI版终端
java·人工智能·intellij-idea
vipxieliang1 小时前
ValidX 正则表达式预编译优化:Pattern 复用策略
java·spring boot·后端
工一木子2 小时前
设计模式与生活⑩:地铁没变,你换了个状态
设计模式
Wang's Blog2 小时前
Java 项目实战:交友项目 - FastDFS 工作原理
java·大数据·交友
Wang's Blog2 小时前
Java 项目实战:交友项目 - 保存访客记录
java·开发语言·交友
liangbo72 小时前
Spring系列01:IoC 与 DI 到底解决了什么
java·spring
江湖中的阿龙2 小时前
Oracle 紧急安全警报:Java 9.1 分漏洞 CVE-2026-91403,撤销对 eMudhra 风险证书的信任
java·安全·oracle