设计模式3-责任链模式

news2025/1/19 2:38:25

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

类图:

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

时序图:

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

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

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

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

责任链模式的优点包括:

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

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

代码:

// 定义处理请求的接口
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.coloradmin.cn/o/1441820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索Xposed框架:个性定制你的Android体验

探索Xposed框架:个性定制你的Android体验 1. 引言 在当今移动设备市场中,Android系统作为最受欢迎的操作系统之一,其开放性和可定制性备受用户青睐。用户希望能够根据个人喜好和需求对其设备进行定制,以获得更符合自己习惯的使用…

svg 进阶

svg 进阶 svg 应用场景 绘制 icon绘制动画 svg viewport 和 viewBox viewport 是 svg 图像的可见区域 viewBox 是用于在画布上绘制 svg 图形的坐标系统 在一下案例中 svg中 width“500” height“200” 就是可视区域 比如你的svg是100X100但是你的可视区域只有20X20 那么他…

c语言中的模拟多态性

在C语言中模拟多态性 多态性是面向对象编程中的一个核心概念,它允许我们通过一个共同的接口来操作不同的数据类型。虽然C语言是一种过程式语言,本身不直接支持面向对象的特性,如继承、封装和多态,但我们可以通过一些技巧来模拟这些…

mac docker 宿主机和容器间网络打通

动因 是这样,笔者最近满怀欣喜入手Docker,看着各种文章命令都是不断点头称道:“嗯嗯,不错不错”,在接下来终于准备大干一场的时候碰壁了,主要情况是说在Mac中跑了第一把的时候发现碰到,虚拟机和宿主机居然…

arkTS开发鸿蒙OS应用(登录页面实现,连接数据库)

前言 喜欢的朋友可在抖音、小红书、微信公众号、哔哩哔哩搜索“淼学派对”。知乎搜索“编程淼”。 前端架构 Toubu.ets import router from ohos.router Component export struct Header{build(){// 标题部分Row({space:5}){Image($r(app.media.fanhui)).width(20).onClic…

HiveSQL——用户中两人一定认识的组合数

注:参考文章: SQL之用户中两人一定认识的组合数--HQL面试题36【快手数仓面试题】_sql面试题-快手-CSDN博客文章浏览阅读1.2k次,点赞3次,收藏12次。目录0 需求分析1 数据准备2 数据分析3 小结0 需求分析设表名:table0现…

深度分析一款新型Linux勒索病毒

前言 DarkRadiation勒索病毒是一款全新的Linux平台下的勒索病毒,2021年5月29日首次在某平台上发布了此勒索病毒的相关的信息,6月中旬趋势科技针对这个新型的勒索病毒进行了相关的分析和报道。 DarkRadiation勒索病毒采用Bash脚本语言编写实现&#xff0…

渗透测试练习题解析 2(CTF web)

题目均来自 BUUCTF 1、[极客大挑战 2019]Upload 1 考点:文件上传漏洞 进入靶场 一看就知道是考察文件上传漏洞,看源码有没有敏感信息 没有什么敏感信息,那我们试着按要求传一张图片看看结果,但是传了 png、jpg 类型的图片后发现上…

那些 C语言指针 你不知道的小秘密 (4)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能…

蓝桥杯每日一练(python)B组

###来源于dotcpp的蓝桥杯真题 题目 2735: 蓝桥杯2022年第十三届决赛真题-取模&#xff08;Python组&#xff09; 给定 n, m &#xff0c;问是否存在两个不同的数 x, y 使得 1 ≤ x < y ≤ m 且 n mod x n mod y 。 输入格式&#xff1a; 输入包含多组独立的询问。 第一…

Linux开发工具的使用 (gcc/g++ | gdb)

目录 一、gcc/g 1.关于gcc/g 2.gcc如何使用 gcc选项&#xff1a; 预处理&#xff1a; 编译: 汇编: 连接: 函数库是什么&#xff1a; 函数库分为动态库和静态库两种 二、调试器gdb 1.关于gdb 2. gdb的使用 gdb选项&#xff1a; Linux是一个广泛用于开发的操作系统&…

uni-app x,一个纯原生的Android App开发工具

uni-app x&#xff0c;下一代uni-app&#xff0c;一个神奇的产品。 用vue语法、uni的组件、api&#xff0c;以及uts语言&#xff0c;编译出了kotlin的app。不再使用js引擎和webview。纯纯的kotlin原生app。 uni-app x&#xff0c;让“跨平台开发性能不如原生”的这条曾广为流…

【集合系列】TreeMap 集合

TreeMap 集合 1. 概述2. 方法3. 遍历方式4. 排序方式5. 代码示例16. 代码示例27. 代码示例38. 注意事项9. 源码分析 其他集合类 父类 Map 集合类的遍历方式 TreeSet 集合 具体信息请查看 API 帮助文档 1. 概述 TreeMap 是 Java 中的一个集合类&#xff0c;它实现了 SortedMap…

【网工】华为设备命令学习(服务器发布)

本次实验主要是内网静态nat配置没&#xff0c;对外地址可以理解为一台内网的服务器&#xff0c;外网设备可以ping通内网的服务器设备&#xff0c;但是ping不通内网的IP。 除了AR1设备配置有区别&#xff0c;其他设备都是基础IP的配置。 [Huawei]int g0/0/0 [Huawei-GigabitEt…

5.1 灯光色彩与视觉

5.1 灯光色彩与视觉 视觉成像 灯光与物体的反应:吸收,反射和折射 色彩:光照到物体上,物体吸收其他光源色,只反射该颜色光,所以物体 表面呈现该颜色 视觉:该颜色光进入人眼刺激感光细胞,并在视网膜上形成影像. ABSORBTION 一、基础灯光 1.环境光&#xff08;Ambient Light…

Python小白:Python 编辑器那么多种,到底怎么选!!

前言 我在刚刚接触编程的时候很纠结于这个问题&#xff0c;因为我想找一个功能强大&#xff0c;免费&#xff0c;可多平台&#xff0c;支持多种语言的编辑器&#xff0c;所以我特意花费了一些时间对 Python 的编辑器进行了调研&#xff0c;我最终选择了 VScode 作为我的首选编…

GEE详细教程之:将Landsat8与Landsat9影像合成一个影像

1.前言 因项目需求&#xff0c;需要获取一个研究区的Landsat8影像&#xff0c;但Landsat8重复周期长&#xff0c;加之天气的影响&#xff0c;很难获取影像质量较好的影像。Landsat4/5/7的波段顺序与landsat8不同&#xff0c;除此之外&#xff0c;landsat7影像还需要工具进行条带…

《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)

文章目录 6.1 设置和管理复制6.1.1 基础知识6.1.2 重点案例&#xff1a;使用 Python 设置 MySQL 主从复制6.1.3 拓展案例 1&#xff1a;自动故障转移6.1.4 拓展案例 2&#xff1a;设置双主复制 6.2 复制的类型和策略6.2.1 基础知识6.2.2 重点案例&#xff1a;使用 Python 设置半…

保育员答案在哪搜?这4款足够解决问题 #媒体#其他#其他

学会运用各类学习辅助工具和资料&#xff0c;是大学生培养自主学习能力和信息获取能力的重要途径之一。 1.石墨文档 石墨文档(Shimo Docs)是一款强大的在线文档协作工具。它提供了多人实时协作、版本控制、评论和批注等功能&#xff0c;方便学生在学习中进行文档编写、合作项…

【芯片设计- RTL 数字逻辑设计入门 14 -- 使用子模块实现三输入数的大小比较】

文章目录 三输入数的大小比较问题分析verilog codeTestBench Code综合图仿真波形图 三输入数的大小比较 在数字芯片设计中&#xff0c;通常把完成特定功能且相对独立的代码编写成子模块&#xff0c;在需要的时候再在主模块中例化使用&#xff0c;以提高代码的可复用性和设计的层…