23种设计模式之责任链模式

责任链模式

1、定义

避免将一个请求的发送者与接受者耦合在一起,让多个对象都有机会处理请求。将接受请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止

2、责任链模式结构

Handler(抽象处理者):定义了一个处理请求的接口,一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。每一个处理者的下家还是一个处理者,故在其中定义一个抽象处理者类型的对象作为对其下家的引用,通过该引用处理者可以形成一条链;

ConcreteHandler(具体处理者):抽象处理者的子类,可以处理用户的请求,实现抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限;在具体处理者中可以访问链中的下一个对象,以便请求的转发

在这里插入图片描述

3、示例

request

public interface Request {}

ConcreteRequest

public class AddMoneyRequest implements Request{}
public class DimissionRequest implements Request{}
public class LeaveRequest implements Request{}

handler

public interface RequestHandler {
    void handleRequest(Request request);
}

ConcreteHandler

public class HRRequestHandler implements RequestHandler {
    @Override
    public void handleRequest(Request request) {
        if (request instanceof DimissionRequest) {
            System.out.println("要离职, 人事审批!");
        }
        System.out.println("请求完毕");
    }
}
public class PMRequestHandler implements RequestHandler {

    private RequestHandler rh;
    public PMRequestHandler(RequestHandler rh) {
        this.rh = rh;
    }

    @Override
    public void handleRequest(Request request) {
        if (request instanceof AddMoneyRequest) {
            System.out.println("要加薪, 项目经理审批!");
        } else {
            rh.handleRequest(request);
        }
    }
}
public class TLRequestHandler implements RequestHandler{

    private RequestHandler rh;

    public TLRequestHandler(RequestHandler rh) {
        this.rh = rh;
    }

    @Override
    public void handleRequest(Request request) {
        if (request instanceof LeaveRequest) {
            System.out.println("要请假, 项目组长审批!");
        } else {
            rh.handleRequest(request);
        }
    }
}

Client

public class Client {

    public static void main(String[] args) {
        RequestHandler hr = new HRRequestHandler();
        RequestHandler pm = new PMRequestHandler(hr);
        RequestHandler tl = new TLRequestHandler(pm);

        //team leader处理离职请求
        Request request = new LeaveRequest();
        tl.handleRequest(request);

        System.out.println("===========");
        //team leader处理加薪请求
        request = new AddMoneyRequest();
        tl.handleRequest(request);

        System.out.println("========");
        //项目经理上理辞职请求
        request = new DimissionRequest();
        pm.handleRequest(request);
    }
}

输出

要请假, 项目组长审批!
===========
要加薪, 项目经理审批!
========
要离职, 人事审批!
请求完毕

4、责任链模式的优缺点

优点
  • 使一个对象无须知道是其他哪一个对象处理其请求,并且链中的对象不需要知道链的结构,由客户端负责链的创建,降低系统的耦合
  • 请求处理对象仅需要维持一个指向其后继者的引用,而不需要维持它所有的候选处理者的引用,可简化对象之间的相互连接
  • 在给对象分派职责时,职责链可以带来更多的灵活性
  • 在系统中增加一个新的具体请求处理者时无须修改原有系统的代码,符合开闭原则
缺点
  • 建链不当可能循环调用陷入死循环
  • 职责链过长,系统性能会受影响

5、适用环境

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  • 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  • 可处理一个请求的对象集合应被动态指定。

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

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

相关文章

事务ACID四大特性(图文详解~)

ACID ACID 是数据库管理系统中保证事务正确执行的四大特性的缩写。 1. Atomicity(原子性): 原子性指事务是不可分割的单位,要么全部执行成功,要么全部失败回滚。—All or nothing. 通常使用日志记录机制来启动回滚功…

Linux 磁盘扩容

centos7 磁盘扩容 yum install -y cloud-utils-growpart 1.扩容vda 1 growpart /dev/vda 1 2.以 resize2fs 格式 resize2fs /dev/vda1 df -TH

机器学习开源分子生成系列(2)-基于三维形状和静电相似性的DeepFMPO v3D安装及使用

前言 本文是基于 3D 的分子生成方法DeepFMPO v3D的介绍及安装使用。 一、DeepFMPO v3D是什么? github代码介绍文章 在药物发现中,如何寻找具新颖性和结构多样性的候选分子是颇受药物设计科学家关注的问题。通过虚拟筛选的化学空间搜索往往会受限于筛选…

软件设计师(中级)备考视频教程

一、视频介绍 本视频主要包括软件设计师系统学习教程,通过学习本视频,可以帮助考生高效且深入地掌握软件设计师资格考试核心知识,全方位覆盖考试要点,从而轻松备战考试。视频不仅涵盖了考试所需的全面知识体系,还通过直…

鸿蒙实训笔记

第一天 #初始化一个新的NPM项目(根据提示操作) npm init #安装TSC、TSLint和NodeJS的类型声明 npm install -s typescript tslint types/node 在根目录中新建一个名为tsconfig.json的文件,然后在代码编辑器中打开,写入下述内容: {"co…

C# Winform的三态CheckBox,以及批量修改Panel中的控件

在C# WinForms中,如果你想批量修改一个Panel容器内的所有CheckBox控件的状态,你可以使用foreach循环来遍历Panel的Controls集合。下面是一个示例,展示了如何将一个Panel内所有的CheckBox控件设为选中状态(Checked true&#xff0…

法制史学习笔记(个人向) Part.4

法制史学习笔记(个人向)_Part.4 6. 唐朝法律制度 6.1 立法概况 立法指导思想:德礼为政教之本,刑罚为政教之用(德主刑辅 → \rightarrow →德本刑用),抬高了刑罚在法律体系中的作用,强调两者兼有&#xff0…

Isaac Lab(isaac sim)中使用python ros

ROS(Robot Operating System)为机器人技术提供了标准化的开发框架和中间件,通过定义接口和约定,简化了硬件与软件的集成,提高了开发效率。它拥有强大的工具集和生态系统,支持从算法开发到系统集成的全过程&…

Django任务管理

1、用django-admin命令创建一个Django项目 django-admin startproject task_manager 2、进入到项目下用命令创建一个应用 cd task_manager python manage.py startapp tasks 3、进入models.py定义数学模型 第2步得到的只是应用的必要空文件,要开始增加各文件实际…

skywalking-2-客户端-php的安装与使用

skywalking的客户端支持php,真的很棒。 官方安装文档:https://skywalking.apache.org/docs/skywalking-php/next/en/setup/service-agent/php-agent/readme/ 前置准备 本次使用的php版本是8.2.13: php -v PHP 8.2.13 (cli) (built: Nov 21 2023 09:5…

近期几首小诗汇总-生活~卷

生活 为生活飘零,风雨都不阻 路见盲人艰,为她心点灯 贺中科大家长论坛成立十五周年 科学家园有喜贺 园外丑汉翘望中 曾一学子入我科 正育科二盼长大 憧憬也能入此家 与科学家论短长 园外翘首听高论 发现有隙入此坛 竟然也能注册成 入园浏览惶然立 此贴…

PostgreSQL17索引优化之支持并行创建BRIN索引

PostgreSQL17索引优化之支持并行创建BRIN索引 最近连续写了几篇关于PostgreSQL17优化器改进的文章,其实感觉还是挺有压力的。对于原理性的知识点,一方面是对这些新功能也不熟悉,为了尽可能对于知识点表述或总结做到准确,因此需要…

springboot websocket 知识点汇总

以下是一个详细全面的 Spring Boot 使用 WebSocket 的知识点汇总 1. 配置 WebSocket 添加依赖 进入maven官网, 搜索spring-boot-starter-websocket,选择版本, 然后把依赖复制到pom.xml的dependencies标签中 配置 WebSocket 创建一个配置类 WebSocketConfig&…

管理无线物联网设备和连接的增长

将项目(或产品)规模化从来不是一件容易的事。然而,随着蜂窝无线物联网的部署,增长挑战尤其令人生畏。 为什么?因为如果不增加复杂性,就无法发展无线物联网部署。复杂性随着物联网而扩大,随着每一个新设备、每一个新的运营商协议…

Python酷库之旅-第三方库Pandas(024)

目录 一、用法精讲 61、pandas.to_numeric函数 61-1、语法 61-2、参数 61-3、功能 61-4、返回值 61-5、说明 61-6、用法 61-6-1、数据准备 61-6-2、代码示例 61-6-3、结果输出 62、pandas.to_datetime函数 62-1、语法 62-2、参数 62-3、功能 62-4、返回值 62-…

C语言指针超详解——强化篇

C语言指针系列文章目录 入门篇 强化篇 文章目录 C语言指针系列文章目录1. assert 断言2. 指针的使用和传址调用2. 1 strlen的模拟实现2. 2 传值调用和传址调用 3. 数组名的理解4. 使用指针访问数组5. 一维数组传参的本质6. 冒泡排序7. 二级指针8. 指针数组9. 指针数组模拟实现…

嵌入式智能手表项目实现分享

简介 这是一个基于STM32F411CUE6和FreeRTOS和LVGL的低成本的超多功能的STM32智能手表~ 推荐 如果觉得这个手表的硬件难做,又想学习相关的东西,可以试下这个新出的开发板,功能和例程demo更多!FriPi炸鸡派STM32F411开发板: 【STM32开发板】 FryPi炸鸡派 - 嘉立创EDA开源硬件平…

缓存的击穿及解决方案

定义及图解 缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时 候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把…

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-标题菜单及游戏结束界面(九)

文章目录 开发思路标题菜单界面标题菜单脚本代码结束菜单界面结束菜单脚本代码 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击(一) 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件(二) 使用Godot4组件制作竖版…

【密码学】密码协议

一、协议的基本概念 (1)协议的定义 协议(Protocol)是指由两个或两个以上的参与者为了完成某项特定的任务而采取的一系列步骤。协议规定了参与者之间的通信格式、数据交换的顺序、错误处理方式以及如何确保通信的安全性和可靠性等…