职责链设计模式

职责链设计模式(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 {@Testvoid 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;@Overridepublic 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);}}@Overridepublic void setNextHandler(PurchaseHandler nextHandler) {this.nextHandler = nextHandler;}}class Director implements PurchaseHandler {private PurchaseHandler nextHandler;@Overridepublic 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);}}@Overridepublic void setNextHandler(PurchaseHandler nextHandler) {this.nextHandler = nextHandler;}}class CEO implements PurchaseHandler {@Overridepublic void processRequest(PurchaseRequest request) {System.out.println("CEO approved the purchase request for " + request.getAmount());}@Overridepublic 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. 日志记录:在日志框架中,不同的日志处理器(如文件、控制台、远程服务器等)可以组成链条,依次处理日志请求。

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

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

相关文章

2024年5月20日 (周一) 叶子游戏新闻

报告老板&#xff0c;现在就加班&#xff01;《职场浮生记》抢先体验版现已上线今天由LeiYun Games开发&#xff0c;2P Games发行的《职场浮生记》正式在Steam平台推出抢先体验版。玩家将跟随主角的步伐踏入一个最为真实的职场环境之中&#xff0c;在生活与工作之间找寻平衡&am…

数据库多表查询

多表查询&#xff1a; SELECT *FROM stu_table,class WHERE stu_table.c_idclass.c_id; 多表查询——内连接 查询两张表交集部分。 隐式内连接&#xff1a; #查询学生姓名&#xff0c;和班级名称&#xff0c;隐式调用 SELECT stu_table.s_name,class.c_name FROM stu_table…

Linux管理文本文件002

今天简单和大家分享一些管理文本文件的指令 1、查看文件类型 file 1&#xff09;file /etc/passwd 文本文件 2&#xff09;File /dev/sda 块设备&#xff08;磁盘&#xff09; 3&#xff09;File /dev/tty 字符设备&#xff08;鼠标&#xff09; 4&#xff09;File /usr/…

力扣hot100学习记录(七)

240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 题意 在二维矩阵中搜索是否存在一个目标值&#xff0c;该矩阵每一行每一列都是升序…

谷歌推出TransformerFAM架构,以更低的消耗处理长序列文本

Transformer对大模型界的影响力不言而喻&#xff0c;ChatGPT、Sora、Stable Difusion等知名模型皆使用了该架构。 但有一个很明显的缺点&#xff0c;其注意力复杂度的二次方增长在处理书籍、PDF等超长文档时会显著增加算力负担。 虽然会通过滑动窗口注意力和稀疏注意力等技术…

行为型设计模式之观察者模式

文章目录 简介定义例子 原理代码例子小结 简介 定义 还是先来个定义吧&#xff0c;如下&#xff1a; 观察者模式(observer pattern)的原始定义是&#xff1a;定义对象之间的一对多依赖关系&#xff0c;这样当一个对象改变状态时&#xff0c;它的所有依赖项都会自动得到通知和…

亚马逊云科技峰会福利来啦

2024 亚马逊云科技中国峰会&#xff0c;挑战俱乐部 Hands On 动手实验课程正在直播中&#xff0c;点击链接畅享生成式AI建构之旅&#xff0c;赢心动好礼 &#xff08;直播链接Link&#xff09; 只看不过瘾&#xff1f;别急&#xff01;我们为您准备了【生成式AI助手 Amazon Q 初…

mybatis一对一,一对多,字段重复

1、一对一&#xff0c;association和javaType <resultMap type"com.example.ProdTask" id"ProdTaskMapWithDInvChkTask"><result property"taskCateg" column"ProdTask_CATEG" jdbcType"VARCHAR"/><result p…

手机视频恢复2个技巧:让您的视频资料重现生机

我们经常使用手机拍摄和保存各种视频资料&#xff0c;包括工作记录和日常生活的记忆。但有时候&#xff0c;由于误删、格式化或存储空间不足&#xff0c;我们会选择清理手机空间&#xff0c;这些视频资料可能会因此消失不见。今天&#xff0c;我们将为您揭秘手机视频恢复的技巧…

前端-TS代码解读—索引签名:type Recordable<T = any> = { [x: string]: T;}

在TypeScript中&#xff0c;这段代码定义了一个类型别名 Recordable&#xff0c;它使用了索引签名&#xff08;index signature&#xff09;来表示一个可记录&#xff08;record-like&#xff09;对象。这个类型别名是泛型的&#xff0c;这意味着它可以用于创建具有任意类型属性…

北斗卫星赋能水产养殖

北斗卫星赋能水产养殖&#xff1a;开启精准智能化新时代 天气稍有变化&#xff0c;浙江省江山市上余水产养殖场负责人就会通过手机APP实时查看鱼塘水体硝态氮、氨态氮、pH值、化学需氧量等水质参数&#xff0c;做到心中有数。这些数据由鱼塘内的巡航式底改机器人以及数字化监测…

S32K324 HSE固件加载配置及说明

文章目录 前言HSE固件HSE使用的空间FlashRamHSE的安装方式IVT结构ld文件UTEST区编程复位编译测试总结前言 本文介绍HSE固件的下载,及利用S32DS工程及PE工具安装。(本文只讨论对于full_men方式的HSE) HSE固件 注册NXP官网账号后,在S32K3 实时驱动(RTD)中

计算机视觉与深度学习实战:以Python为工具,基于帧间差法进行视频目标检测

一、引言 随着科技的飞速发展,计算机视觉和深度学习已成为当今科技领域的热门话题。它们不仅在科研领域取得了显著的成果,而且在安防监控、智能交通、医疗影像分析、工业自动化等领域得到了广泛的应用。本文旨在探讨计算机视觉与深度学习的实战应用,特别是以Python为工具,基…

Vue中使用Vue-scroll做表格使得在x轴滑动

页面效果 首先 npm i vuescroll 在main.js中挂载到全局 页面代码 <template><div class"app-container"><Header :titletitle gobackgoBack><template v-slot:icon><van-icon clickgoHome classicon namewap-home-o /></templat…

Python自动化测试中的Mock与单元测试实战

在软件开发过程中&#xff0c;自动化测试是确保代码质量和稳定性的关键一环。而Python作为一门灵活且强大的编程语言&#xff0c;提供了丰富的工具和库来支持自动化测试。本文将深入探讨如何结合Mock与单元测试&#xff0c;利用Python进行自动化测试&#xff0c;以提高代码的可…

Linux-线程池

文章目录 前言一、线程池是什么&#xff1f;二、示例代码 前言 线程池主要是对之前内容的一个巩固&#xff0c;并且初步了解池化概念。 一、线程池是什么&#xff1f; 线程池就是提前开辟好一块空间&#xff0c;随时准备创造新线程来完成任务&#xff0c;可以理解为用空间来换…

攻击同学网络,让同学断网

技术介绍&#xff1a;ARP欺骗 ARP欺骗&#xff08;ARP spoofing&#xff09;是一种网络攻击技术&#xff0c;它通过伪造ARP&#xff08;地址解析协议&#xff09;响应包来欺骗目标设备&#xff0c;使其将网络流量发送到攻击者指定的位置。具体操作步骤如下&#xff1a; 攻击者…

win/mac 崩溃内存泄漏问题分析

内存泄露排查 mac: xcode自带工具 参考 leak AddressSanitize windows: vld dmp排查 windows dmp 安装 WinDbg - Windows drivers | Microsoft Learn 本地或者远端均可用vs排查 mac dmp 本地查看控制层生成的.crash文件 远端的使用google breakpad client工具解析minidu…

C#--Mapster(高性能映射)用法

1.Nuget安装Mapster包引用 2.界面XAML部分 <Window x:Class"WpfApp35.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.m…

buffer 越大传输效率越低

在计算机科学和网络通信中&#xff0c;Buffer&#xff08;缓冲区&#xff09;扮演着至关重要的角色。然而&#xff0c;关于Buffer的大小与传输效率之间的关系&#xff0c;往往存在一个普遍的误解&#xff0c;即认为Buffer越大&#xff0c;传输效率就越高。事实上&#xff0c;过…