【设计模式-职责链】

news2024/9/30 18:05:02

定义

职责链模式是一种行为设计模式,**它通过将请求发送给链上的多个处理者来避免请求发送者与处理者之间的紧密耦合。每个处理者可以选择处理请求或将其传递给链中的下一个处理者。**这样,可以将处理请求的责任链式组织,从而实现更灵活的请求处理机制。

UML图

在这里插入图片描述

角色

  • Handler(处理者接口):定义处理请求的方法,并声明一个指向下一个处理者的引用。
  • ConcreteHandler(具体处理者):实现处理者接口,具体处理请求的逻辑。每个具体处理者可以决定是否处理请求,或将其传递给下一个处理者。
  • Client(客户端):发送请求的对象。客户端通常只需要知道请求的起始处理者,而不需要关心具体的处理链。

工作流程

  1. 客户端创建一个请求,并指定链中的第一个处理者。
  2. 第一个处理者接收到请求后,根据自己的处理逻辑决定是处理请求还是将请求传递给下一个处理者。
  3. 如果处理者处理请求,则返回结果;如果不处理,则继续将请求传递给链中的下一个处理者,直到请求被处理或到达链的末尾。

代码

// Handler interface
abstract class Handler {
    protected Handler nextHandler;

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void handleRequest(int request);
}

// ConcreteHandler1
class ConcreteHandler1 extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request < 10) {
            System.out.println("Handler1 handled request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// ConcreteHandler2
class ConcreteHandler2 extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println("Handler2 handled request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// ConcreteHandler3
class ConcreteHandler3 extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request >= 20) {
            System.out.println("Handler3 handled request: " + request);
        }
    }
}

// Client code
public class ChainOfResponsibilityDemo {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handler3 = new ConcreteHandler3();

        handler1.setNextHandler(handler2);
        handler2.setNextHandler(handler3);

        // Test requests
        handler1.handleRequest(5);   // Handled by Handler1
        handler1.handleRequest(15);  // Handled by Handler2
        handler1.handleRequest(25);  // Handled by Handler3
    }
}

优点

  • 降低耦合性:请求发送者与处理者之间的关系松散,可以独立地添加、删除或更改处理者。
  • 动态添加或更改处理者:可以在运行时动态地改变请求处理链。
  • 简化代码:请求处理的逻辑分散到多个处理者中,使得代码更简洁、可读性更高。

缺点

  • 调试困难:由于请求在多个处理者之间传递,可能导致调试和追踪请求流变得复杂。
  • 可能的性能问题:如果链过长,可能导致处理请求的时间较长。

场景

  • 当多个对象可以处理同一个请求,但不知道具体哪个对象会处理时。
  • 当需要动态处理请求时,例如在GUI事件处理、日志处理等场景中。
  • 当请求处理的责任可以通过链式结构灵活组织时。

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

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

相关文章

LeetCode 面试经典150题 66.加一

题目&#xff1a;给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 思路&#xff1a; 代码&…

winform 中 panel 中添加可视对象错位问题

今天在写程序的时候&#xff0c;发现动态添加到panel_wokrarea中的按钮&#xff0c;同样是posx0&#xff0c;有时并不能对齐&#xff0c;会和当前窗口中panel_wokrarea在屏幕上的显示区域的最左边&#xff08;panel_wokrarea很宽&#xff09; 经分析&#xff0c;是因为panel 在…

828华为云征文 | 华为云Flexus X实例在混合云环境中的应用与实践

目录 前言 1. 混合云环境的优势与挑战 1.1 混合云的优势 1.2 混合云的挑战 2. Flexus X实例的配置与集成 2.1 Flexus X实例简介 2.2 Flexus X实例的混合云部署 2.3 配置步骤与措施 3. 数据迁移与同步策略 3.1 数据迁移方案 3.2 数据同步措施 4. 安全性与合规性管理…

我们用等距投影制作了一个动画视频

一家国际网络安全公司委托我们制作一部关于其网络安全产品的解释性视频。为了有效传达产品的价值给潜在客户和利益相关者&#xff0c;我们决定采用等距投影技术制作动画视频。等距投影是一种复杂的视觉呈现方式&#xff0c;它能够让人物和物体看起来具有三维效果&#xff0c;而…

FileLink跨网文件交换|解决网络隔离导致的文件共享难题

在现代企业的运营中&#xff0c;跨网文件交换已经成为一个重要的需求。然而&#xff0c;网络隔离和安全政策往往使得文件共享变得困难。FileLink作为一种创新的解决方案&#xff0c;旨在有效应对这些挑战&#xff0c;提升文件共享效率。 一、网络隔离的挑战 网络隔离常常是出于…

基于ESP8266—AT指令连接阿里云+MQTT透传数据(2)

MQTT_TX设备为发送数据的Topic&#xff0c;使用MQTT-fx软件实现 MQTT_RX设备为接收(订阅)数据的Topic&#xff0c;使用ESP8266通过AT指令实现 一、使用MQTT-fx实现发送数据 首先进入控制台&#xff0c;获取发送设备 “ MQTT_TX ” 的MQTT连接参数&#xff0c;具体具体操作如…

NineData云原生智能数据管理平台新功能发布|2024年9月版

本月发布 3 项更新&#xff0c;其中重点发布 3 项。 重点发布 数据复制 - 新增 Oracle 到 Kafka 复制链路 数据复制功能新增支持将 Oracle 中的数据复制到 Kafka&#xff0c;实现数据的实时流转和分发&#xff0c;支持全量和增量。 数据复制 - 新增库表分组复制 创建复制任务…

电信杯扬帆起航 灵途科技携手中国地质大学推动产学协同创新

近日&#xff0c;由中国地质大学机械与电子信息学院主办的“电信杯”正式启动。作为该校电子信息领域的一项特色创新赛事&#xff0c;此次活动由中国地质大学电子信息工程研创会主办&#xff0c;武汉灵途传感科技有限公司、中建三局智能技术有限公司和武汉盛帆电子股份有限公司…

手把手教你用Python进行Web抓取(附代码)

本教程以在Fast Track上收集百强公司的数据为例&#xff0c;教你抓取网页信息。 作为一名数据科学家&#xff0c;我在工作中所做的第一件事就是网络数据采集。使用代码从网站收集数据&#xff0c;当时对我来说是一个完全陌生的概念&#xff0c;但它是最合理、最容易获取的数据来…

CAN总线的错误类型

前言 CAN总线的错误类型主要包括&#xff1a;位错误、填充错误、格式错误、ACK错误和CRC错误。这里一定要做好CAN总线的错误类型、错误帧类型、节点状态之间的区别。 错误类型是帧传输出错的原因类型&#xff1b;错误帧类型&#xff08;主动错误帧、被动错误帧&#xff09;是帧…

实习问题(配置文件获取参数)

Java中用SpringBoot框架&#xff0c;当我们要获取配置文件yml里的参数时&#xff0c;用Value注解获取 如果配置文件中没有srvSealUploadPath这个参数的话&#xff0c;可以用Value("${srvSealUploadPath:data/idoc/temp}")&#xff0c;这个的意思是&#xff0c;如果配…

【Python入门】20个Python自动化脚本,解放双手、事半功倍

如果你正在学习Python&#xff0c;那么你需要的话可以&#xff0c;点击这里&#x1f449;Python重磅福利&#xff1a;入门&进阶全套学习资料、电子书、软件包、项目源码等等免费分享&#xff01; 在当今的快节奏工作环境中&#xff0c;自动化不再是一种奢侈&#xff0c;而是…

谷歌浏览器完美清除缓存

1.在页面上按下键盘的F12&#xff0c;打开控制台。 2.鼠标放到刷新图标上&#xff0c;点击鼠标右键&#xff0c;选择‘清空缓存并硬性重新加载’。 这样浏览器对网站页面的缓存就彻底被清理干净了。 目前支持该操作方式的浏览器有谷歌和Edge浏览器。 有的浏览器不支持该方式操…

线上热迁移数据库

1、背景 在线平台用的是公司自己的服务器上面搭建的 MongoDB&#xff0c;测试那边反馈珊瑚海平台 MongoDB 有时会掉线&#xff0c;于是计划将本地数据库迁移到云平台。 2、问题所在 1、因为平台测试的同事还在正在使用平台进行测试工作&#xff0c;所以不可能把平台停掉&…

Web认识 -- 第一课

文章目录 前言一、HTML是什么&#xff1f;二、了解Web1. 基本概念2.Web标准3. Web构成1.前端1. HTML2.CSS3. javaScript4.常见浏览器介绍 2.Web标签构成1.结构标准2.表现标准 -- css3. 行为标准 -- javaScript 总结 前言 这里是我们进入前端学习的开端,在本次更新之后我会陆续…

VUE前后端分离毕业设计题目项目有哪些,VUE程序开发常见毕业论文设计推荐

目录 0 为什么选择Vue.js 1 Vue.js 的主要特点 2 前后端分离毕业设计项目推荐 3 后端推荐 4 总结 0 为什么选择Vue.js 使用Vue.js开发计算机毕业设计是一个很好的选择&#xff0c;因为它不仅具有现代前端框架的所有优点&#xff0c;还能让你专注于构建高性能、高可用性的W…

【C++】map和set的介绍和使用

1.序列式容器与关联式容器 序列式容器&#xff1a; 底层为线性序列的数据结构&#xff0c; 里面存储的是元素本身 。如vector/list/string/deque/forward_list。 关联式容器&#xff1a; 也是用来存储数据的&#xff0c;于序列式容器不同的是&#xff0c; 里面存储的是<key&…

一文详解WebRTC、RTSP、RTMP、SRT

背景 好多开发者&#xff0c;希望对WebRTC、RTSP、RTMP、SRT有个初步的了解&#xff0c;知道什么场景该做怎样的方案选择&#xff0c;本文就四者区别做个大概的介绍。 WebRTC 提到WebRTC&#xff0c;相信好多开发者第一件事想到的就是低延迟&#xff0c;WebRTC&#xff08;W…

基于IntraWeb的数据表格的多选实现

基于IntraWeb的数据表格的多选实现 既可以单条操作&#xff0c;也可以多选操作。 delphi源代码。 BS开发Web网站开发&#xff0c;不需要安装服务器&#xff0c;Apache和IIS都不需要&#xff0c;自带企业级服务器。 运行exe服务器就架好了&#xff0c;直接打开手机浏览器或者…

技术成神之路:设计模式(十八)适配器模式

介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许接口不兼容的类可以协同工作&#xff0c;通过将一个类的接口转换成客户端所期望的另一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的类可以一起工作。 1.定义 适配…