设计模式3-责任链模式

news/2024/5/19 15:36:34 标签: 设计模式, 责任链模式, java

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

类图:

从图中可见最大的特点是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)的顺序处理日志消息,每个处理者负责记录特定级别的日志,如果某个处理者无法处理某个级别的日志,则将日志传递给下一个处理者。

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

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

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

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

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

结论:

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


http://www.niftyadmin.cn/n/5371239.html

相关文章

蓝桥杯2023年第十四届省赛真题----棋盘

题目描述 小蓝拥有 n n 大小的棋盘,一开始棋盘上全都是白子。小蓝进行了 m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反 (也就是白色棋子变为黑色,黑色棋子变为白色)。请输出所有操作做完后棋盘上每个棋子的颜色。 输入格式 输…

linux 下 chrome 无法在设置里面配置代理的解决方法

文章目录 [toc]解决方法查找 chrome 命令路径查看 chrome 启动文件方式一方法二 在 linux 环境下,使用 chrome 没办法像 firefox 一样在设置里面配置代理,打开 chrome 的设置会有下面的内容显示 When running Google Chrome under a supported desktop e…

C语言——oj刷题——调整数组使奇数全部都位于偶数前面

题目: 输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。 一、实现方法: 当我们需要对一个整数数组进行调整,使得奇数位于数…

MyBatis 实现动态 SQL

MyBatis 中的动态 SQL 就是SQL语句可以根据不同的情况情况来拼接不同的sql。 本文会介绍 xml 和 注解 两种方式的动态SQL实现方式。 XML的实现方式 先创建一个数据表,SQL代码如下: DROP TABLE IF EXISTS userinfo; CREATE TABLE userinfo (id int(1…

ChatGPT 变懒最新解释!或和系统Prompt太长有关

大家好我是二狗。 ChatGPT变懒这件事又有了最新解释了。 这两天,推特用户Dylan Patel发文表示: 你想知道为什么 ChatGPT 和 6 个月前相比会如此糟糕吗? 那是因为ChatGPT系统Prompt是竟然包含1700 tokens,看看这个prompt里面有多…

一周学会Django5 Python Web开发-Django5创建项目(用命令方式)

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频,包括:2024版 Django5 Python we…

Idea里自定义封装数据警告解决 Spring Boot Configuration Annotation Processor not configured

我们自定对象封装指定数据&#xff0c;封装类上面一个红色警告&#xff0c;虽然不影响我们的执行&#xff0c;但是有强迫症看着不舒服&#xff0c; 去除方式&#xff1a; 在pom文件加上坐标刷新 <dependency><groupId>org.springframework.boot</groupId><…

【Network Management】谁来触发CanNm状态机跳转及CanNm如何知道主(被)动唤醒

目录 前言 正文 1.网络管理基本概念 2.CanNm和BswM模块交互 2.1 BswNMControl配置容器