职责链设计模式

职责链设计模式(Chain of Responsibility Design Pattern)是一种行为设计模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这些对象被链接成一条链,沿着这条链传递请求,直到有一个对象处理它为止。

关键角色

  1. 处理者(Handler):定义一个处理请求的接口,并实现设置下一个处理者的方法。
  2. 具体处理者(Concrete Handler):继承处理者接口,实现具体的处理请求的逻辑。如果不能处理请求,就传递给下一个处理者。
  3. 客户端(Client):创建具体处理者的实例,并设置它们的链接关系,然后将请求发送给链上的第一个处理者。

实现步骤

  1. 定义处理者接口:
    包含处理请求的方法和设置下一个处理者的方法。
  2. 实现具体处理者类:
    继承处理者接口,实现具体的处理逻辑。
  3. 创建处理者链:
    在客户端代码中,实例化具体处理者,并设置它们之间的链接关系。

示例代码

以下是一个简单的示例,实现职责链模式。

package com.example.study.pattern;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@Slf4j
@SpringBootTest
class ApplicationTests {

    @Test
    void contextLoads() {

        // 创建具体处理者对象
        PurchaseHandler manager = new Manager();
        PurchaseHandler director = new Director();
        PurchaseHandler ceo = new CEO();

        // 设置处理者链
        manager.setNextHandler(director);
        director.setNextHandler(ceo);

        // 发送购买请求
        PurchaseRequest request1 = new PurchaseRequest(500);
        PurchaseRequest request2 = new PurchaseRequest(3000);
        PurchaseRequest request3 = new PurchaseRequest(10000);

        manager.processRequest(request1);
        manager.processRequest(request2);
        manager.processRequest(request3);

    }

    // 创建一个处理者接口
    interface PurchaseHandler {
        void processRequest(PurchaseRequest request);
        void setNextHandler(PurchaseHandler nextHandler);
    }

    // 创建具体处理者类
    class Manager implements PurchaseHandler {
        private PurchaseHandler nextHandler;

        @Override
        public void processRequest(PurchaseRequest request) {
            if (request.getAmount() <= 1000) {
                System.out.println("Manager approved the purchase request for " + request.getAmount());
            } else if (nextHandler != null) {
                nextHandler.processRequest(request);
            }
        }

        @Override
        public void setNextHandler(PurchaseHandler nextHandler) {
            this.nextHandler = nextHandler;
        }
    }

    class Director implements PurchaseHandler {
        private PurchaseHandler nextHandler;

        @Override
        public void processRequest(PurchaseRequest request) {
            if (request.getAmount() <= 5000) {
                System.out.println("Director approved the purchase request for " + request.getAmount());
            } else if (nextHandler != null) {
                nextHandler.processRequest(request);
            }
        }

        @Override
        public void setNextHandler(PurchaseHandler nextHandler) {
            this.nextHandler = nextHandler;
        }
    }

    class CEO implements PurchaseHandler {
        @Override
        public void processRequest(PurchaseRequest request) {
            System.out.println("CEO approved the purchase request for " + request.getAmount());
        }

        @Override
        public void setNextHandler(PurchaseHandler nextHandler) {
            // CEO是处理者链的最后一个处理者,无需设置下一个处理者
        }
    }

    // 创建购买请求类
    class PurchaseRequest {
        private double amount;

        public PurchaseRequest(double amount) {
            this.amount = amount;
        }

        public double getAmount() {
            return amount;
        }
    }
}

运行结果

在这里插入图片描述

优点

  1. 松散耦合:请求发送者和处理者解耦,请求者无需知道谁处理了请求。
  2. 灵活性:可以在运行时动态增加或修改处理者链。
  3. 责任分担:每个处理者只需处理自己负责的部分,简化了复杂任务的处理。

使用场景

  1. 事件处理:在GUI应用程序中,处理鼠标和键盘事件时,可以使用职责链模式,依次传递事件给各个组件,直到某个组件处理该事件。
  2. 审批流程:在企业应用中,例如请假审批流程,不同的管理层级按照顺序审批。
  3. 日志记录:在日志框架中,不同的日志处理器(如文件、控制台、远程服务器等)可以组成链条,依次处理日志请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/656772.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】自动导入组件

1. 下载插件 npm install unplugin-vue-components 2. 修改vite.config.js import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from vitejs/plugin-vue import Components from unplugin-vue-components/vite // 按需加载自定义组件/…

2、PHP 8.1.0-dev 后门远程命令执行漏洞复现

1、青少年ctf&#xff0c;题目PHP后门 2、页面 3、bp抓包发现PHP版本为8.1.0-dev 4、尝试使用以前爆出过的漏洞&#xff08;网上查相关案例&#xff09; User-Agentt: zerodiumvar_dump(5*5); User-Agentt: zerodiumsystem("cat /flag"); 5、查找flag User-Agentt: z…

3.游戏中自定义数据类型的解读分析

知识来源于腾讯课堂易道云 结构的解释&#xff1a; 计算机里的所有东西都是用二进制表示的&#xff0c;二进制是数字&#xff0c;我们用的阿拉伯数字0-9这个数字是十进制&#xff0c;计算机用的是二进制只有0或1&#xff0c;然后都是一堆0或1的数字&#xff0c;游戏中怎么把这…

路径规划算法--BFS

系列文章目录 文章目录 系列文章目录一、BFS二、BFS伪代码BFS与Dijkstra区别 一、BFS BFS&#xff08;Breadth First Search&#xff09;为广度优先搜索&#xff0c;是一种用于遍历或搜索树或图的搜索算法&#xff0c;适用于无权图的遍历。BFS从根节点开始&#xff0c;探索其相…

AI大模型:大数据+大算力+强算法

前言&#xff1a;好久不见&#xff0c;甚是想念&#xff0c;我是辣条&#xff0c;我又回来啦&#xff0c;兄弟们&#xff0c;一别两年&#xff0c;还有多少老哥们在呢&#xff1f; 目录 一年半没更文我干啥去了&#xff1f; AI大模型火了 人工智能 大模型的理解 为什么学习…

【Python】 Python中__slots__的妙用:提升性能与内存管理

基本原理 在Python中&#xff0c;每个类默认都会继承自object类&#xff0c;而object类在Python中是一个动态类&#xff0c;允许动态地添加属性和方法。这种灵活性使得Python在某些情况下非常强大和灵活&#xff0c;但同时也带来了一些性能和内存使用上的开销。 为了解决这个…

简化跨网文件传输摆渡过程,降低IT人员工作量

在当今数字化时代&#xff0c;IT企业面临着日益增长的数据交换需求。随着网络安全威胁的不断演变&#xff0c;网关隔离成为了保护企业内部网络不受外部威胁的重要手段。然而&#xff0c;隔离的同时&#xff0c;企业也需要在不同网络间安全、高效地传输文件&#xff0c;这就催生…

ubuntu strace命令

strace 是 Linux 系统中的一个调试工具&#xff0c;用于跟踪并记录系统调用&#xff08;system calls&#xff09;和信号&#xff08;signals&#xff09;。在 Ubuntu 中&#xff0c;strace 命令可以帮助开发者和系统管理员了解一个程序在运行时如何与操作系统内核进行交互&…

渗透测试工具Cobalt strike-1.CS介绍与配置

Cobalt Strike是一款美国Red Team开发的渗透测试神器&#xff0c;常被业界人称为CS。最近这个工具大火&#xff0c;成为了渗透测试中不可缺少的利器。其拥有多种协议主机上线方式&#xff0c;集成了提权&#xff0c;凭据导出&#xff0c;端口转发&#xff0c;socket代理&#x…

骨折分类数据集1129张10类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;1129 分类类别数&#xff1a;10 类别名称:["avulsion_fracture",…

使用 RT 矩阵进行 3D 点云变换详解(基于 PCL 和 Eigen 库)

在 3D 点云处理中&#xff0c;RT 矩阵是一个常用的工具&#xff0c;用于对点云进行旋转和平移操作。本文将详细介绍 RT 矩阵的概念&#xff0c;并通过一个示例程序演示如何基于 PCL 和 Eigen 库将一帧点云进行矩阵变换再输出。 本教程的示例代码和点云数据可在 GitHub 下载。 什…

100个 Unity小游戏系列六 -Unity 抽奖游戏专题四 翻卡游戏

一、演示效果 二、知识点讲解 2.1 布局 void CreateItems(){reward_data_list reward_data_list ?? new List<RewardData>();reward_data_list.Clear();for (int i 0; i < ItemCount; i){GameObject item;if (i 1 < itemParent.childCount){item itemParent…

垂类短视频:四川鑫悦里文化传媒有限公司

垂类短视频&#xff1a;内容细分下的新媒体力量 随着移动互联网的迅猛发展和智能手机的普及&#xff0c;短视频已成为当下最受欢迎的媒介形式之一。四川鑫悦里文化传媒有限公司而在短视频领域&#xff0c;一个新兴的概念——“垂类短视频”正逐渐崭露头角&#xff0c;以其独特…

⌈ 传知代码 ⌋ 高速公路车辆速度检测软件

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

WMS仓库管理系统是怎么操作的?WMS操作流程详解

WMS 是仓库管理系统(Warehouse Management System) 的缩写。通过标准化的来料管理、拣配管理、仓库管理&#xff0c;打造实时化、透明化、可视化的仓储管理体系。一款合格的wms系统具有以下优势 提供实时可视性和自动化仓储流程&#xff0c;帮助企业更好地应对复杂的供应链网络…

python fstring教程(f-string教程)(python3.6+格式化字符串方法)

文章目录 Python F-String 教程&#xff1a;深度探究与实用指南引言基础用法什么是F-String?表达式嵌入 格式化选项小数点精度宽度与对齐数字格式化 高级用法复杂表达式调用函数多行F-String嵌套格式化 总结 Python F-String 教程&#xff1a;深度探究与实用指南 引言 在Pyt…

AI赋能:人工智能技术驱动下的品牌海外市场精准分析与营销策略

随着全球化的加速和科技的飞速发展&#xff0c;品牌在海外市场的竞争愈发激烈。为了在竞争激烈的国际市场中脱颖而出&#xff0c;品牌需要更深入地了解海外消费者的行为、趋势和偏好。在这个过程中&#xff0c;人工智能&#xff08;AI&#xff09;技术以其强大的数据处理和分析…

闲话 .NET(6):.NET Core 各个版本的特性

前言 之前我们聊了一下 .NET Core 有哪些优势&#xff0c;.NET Core 发展非常迅速&#xff0c;不过短短几年&#xff0c;.NET Core 已经发布 .NET 8 了&#xff0c;基本上保持了一年一个版本的速度&#xff0c;每个版本都有自己的独有特性&#xff0c;下面我们来简单的盘点一下…

Enable Full Line suggestions 启用全行建议

开启后效果如下&#xff1a; 直接提示可能要输入的参数

医卫兰大药学试题及答案,分享几个实用搜题和学习工具 #媒体#微信

这些软件以其强大的搜索引擎和智能化的算法&#xff0c;为广大大学生提供了便捷、高效的解题方式。下面&#xff0c;让我们一起来了解几款备受大学生欢迎的搜题软件吧&#xff01; 1.彩虹搜题 这个是公众号 题库内容丰富全面&#xff0c;细致分类整理。找题再也不费力&#…