设计模式之责任链模式

【Java设计模式】Java设计模式之(五)责任链模式(Chain of Responsibility Pattern) 本文目录 一、责任链模式介绍 二、代码实现 2.1 业务逻辑 2.2 代码实现 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。 一、责任链模式介绍 意图:避免请求发送者与接收者耦合在一起,让多个对象都 阅读详情

责任链模式介绍

责任链模式是将链中的每一个节点看成是一个对象,每个节点处理的请求不同,且内部自动维护一个下一个节点对象。当一个请求从链的首端发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求。属于行为型设计模式。

使用场景

责任链模式主要是解耦了请求与处理,客户端只需要将请求发送到链上即可,无需关心请求的具体内容和处理细节,请求会自动进行传递,直至有处理对象进行处理。适用于以下场景:

  • 多个对象可以处理一个请求,但由哪一个对象处理,则在运行时动态决定。
  • 在不明确指定接收者的情况下,向多个对象中的一个提交请求。
  • 可以动态指定一组对象处理请求。

代码示例

利用责任链模式进行数据校验拦截。

抽象处理类(Handler)

结合了建造者模式

package com.example.proxy.designpatten.chain;

/**
 * @author ludengke
 * @title: Handler
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/1511:43
 */
public abstract class Handler<T> {
    protected Handler chain;
    public void next(Handler handler){
        this.chain=handler;
    }
    public abstract void doHandle(Member member);

    public static class Builder<T>{
        private Handler<T> head;
        private Handler<T> tail;

        public Builder<T> addHandler(Handler<T> handler){
            if (this.head==null){
                this.head=this.tail=handler;
                return this;
            }
            this.tail.next(handler);//给链中的下一个对象赋值
            this.tail=handler;
            return this;
        }
        public Handler<T> build(){
            return this.head;
        }
    }
}

具体处理类

package com.example.proxy.designpatten.chain;

/**
 * @author ludengke
 * @title: AuthHandler
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/1511:50
 */
public class AuthHandler extends Handler{
    @Override
    public void doHandle(Member member) {
        if (!"管理员".equals(member.getRoleName())){
            System.out.println("不是管理员,没有操作权限");
            return;
        }
        System.out.println("认证成功,往下执行");
        if (this.chain!=null){
            this.chain.doHandle(member);
        }
    }
}

package com.example.proxy.designpatten.chain;

/**
 * @author ludengke
 * @title: LoginHandler
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/1511:48
 */
public class LoginHandler extends Handler{
    @Override
    public void doHandle(Member member) {
        System.out.println("登录成功");
        member.setRoleName("管理员");
        if (this.chain!=null){
            this.chain.doHandle(member);
        }    }
}

package com.example.proxy.designpatten.chain;

import org.springframework.util.StringUtils;

/**
 * @author ludengke
 * @title: ValidateHandler
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/1511:45
 */
public class ValidateHandler extends Handler{
    @Override
    public void doHandle(Member member) {
        if (member==null
                || StringUtils.isEmpty(member.getName())
                ||StringUtils.isEmpty(member.getPwd())){
            System.out.println("用户或密码为空");
            return;
        }
        System.out.println("用户密码校验成功,往下执行");
        if (this.chain!=null){
            this.chain.doHandle(member);
        }    }
}

客户端

package com.example.proxy.designpatten.chain;

/**
 * @author ludengke
 * @title: MemberService
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/1511:42
 */
public class MemberService {
    public void login(String name,String pwd){
        Member member=new Member();
        member.setName(name);
        member.setPwd(pwd);
        Handler.Builder builder=new Handler.Builder();
        builder.addHandler(new ValidateHandler())
                .addHandler(new LoginHandler())
                .addHandler(new AuthHandler());
        //返回head,就是返回整个链
        builder.build().doHandle(member);
    }
}

测试类

package com.example.proxy.designpatten.chain;

/**
 * @author ludengke
 * @title: TestChain
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/1511:53
 */
public class TestChain {
    public static void main(String[] args) {
        MemberService memberService=new MemberService();
        memberService.login("ss","ss");
    }
}

责任链模式的优缺点

优点

  • 将请求与处理解耦。
  • 请求处理者(链中的节点对象)只需要关注请求的处理,对于不感兴趣的请求,转发给下个请求对象即可。
  • 具备链式传递处理请求的功能,请求发送者不需要知道链路结构,只需要等待处理结果。
  • 链式结构灵活,可以通过改变链的调用结构,动态增删责任。
  • 易于扩展,可以加新的责任,符合开闭原则。

缺点

  • 责任链太长,处理时间可能过长。
  • 如果节点对象出现循环引用,可能导致死循环,使系统崩溃。
39文章解读与程序——EI\CSCD\北大核心《基于两阶段鲁棒优化算法的微网多电源容量配置》已提供下载资源 电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.《《《《《《《《更多资源还请持续关注本专栏》》》》》》》《《《《《《《《更多资源还请持续关注本专栏》》》》》》》论文与完整源程序_电网论文源程序的博客-优快云博客。电网论文源程序-优快云博客。 阅读详情

相关推荐

手机Camera硬件电路设计:从电源管理到信号完整性的实战解析

本文深入解析了手机Camera硬件电路设计的核心挑战与实战经验,重点聚焦于电源管理与信号完整性两大基石。文章详细阐述了AVDD、DVDD、IOVDD和AFVDD四路电源的差异化设计要点与噪声控制策略,并剖析了MIPI等高速信号通道的完整性设计原则,为硬件工程师提供了从理论到PCB布局布线的完整实战指南。

weixin_28308325的博客 249

设计模式之----Java责任链模式和建造者模式结合使用

上篇介绍了简单的责任链模式的业务场景和使用,在实际的代码中,可能需要结合多种进行使用才会更好。 上篇文章的在service的实现就写的很臃肿,必须指定next,这些在业务场景中都是不能做到很优雅的处理业务。 接下来就是对上一篇的责任链模式进行改造,引入建造者模式。 建构者模式: 建造者设计模式的核心在于隐藏内部构建细节,通过外部的Builder来实现构建。Builder负责Product类对象的具体过程构建,Director负责指导Build,要求Builder按照其指定的顺序去完成Produt的构造。最后

qq_35529931的博客 1768

华为手机连接Win11失败?内核隔离与驱动签名冲突的终极解决指南

在Windows操作系统中,驱动程序是硬件与系统通信的桥梁,其数字签名机制是保障系统内核安全的核心防线。基于虚拟化的安全技术通过强制验证驱动签名,能有效隔离恶意代码,提升系统抵御高级威胁的能力。然而,严格的签名策略有时会与部分硬件驱动产生兼容性问题,导致设备无法识别,直接影响文件传输、应用调试等核心工作流。本文聚焦于华为手机在开启Windows 11内核隔离功能时出现的连接故障,深入剖析驱动签名验证与Hypervisor保护的代码完整性原理,并提供从驱动更新、策略调整到无线替代方案的完整解决路径,帮助用户在

weixin_31309419的博客 350

【设计模式组合拳】建造者+责任链模式

公众号:WarmSmile 全文字数:1400+ 阅读时间:5分钟 建造者模式 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 介绍 意图: 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 主要解决: 主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各.

Longines____的博客 1744

【Zemax光学设计实训一】---单透镜光学设计

建立一个焦距为100mm、入瞳直径为25mm的单透镜系统,该透镜中心厚度为4mm,其两个面的曲率半径分别为100mm、-100mm,全视场2w=10°。该系统在可见光下工作,采用BK7玻璃,光阑设置在人射光线遇到的透镜的第一个光学表面;并对其展开优化。

yh的博客 3616

从CMT2300A实战出发:Sub1G射频匹配电路设计要点与315MHz应用详解

本文从CMT2300A芯片实战出发,详细解析Sub1G射频匹配电路设计要点,特别针对315MHz应用场景。内容涵盖频段划分逻辑、调制方式选择、晶体振荡器设计等基础认知,以及315MHz匹配电路物料选型、巴伦网络处理等实战技巧,并分享PCB布局防干扰设计和实测验证方法,助力开发者优化射频通信性能。

weixin_29238147的博客 162

设计模式|责任链模式(Chain of Responsibility Pattern)

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你创建一个对象链。请求将沿着这个链传递,直到有一个对象处理它为止。这种模式可以使请求的发送者和接收者解耦。 当想让一个以上的对象有机会能够处理同一请求的时候,就可以使用责任链模式(Chanin of Responsibility Pattem)

weixin_44435110的博客 2161

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

WW、forever的博客 1964

责任链模式:处理请求的链式解决方案

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求的处理器串成一个链来处理请求,从而使得各个处理器能够独立地作出决策,而不需要关心其他处理器的存在与处理。这种模式允许动态地重新组织请求的处理方式,增加了系统的灵活性。

不才不才不不才的博客 563

JAVA:Spring Boot 集成 Forest 优雅的 HTTP 客户端

Forest是一个优雅的Java HTTP客户端框架,通过注解式声明简化HTTP接口调用。它支持多HTTP客户端、自动参数绑定、序列化、重试机制和拦截器等功能。本文演示了如何在Spring Boot中集成Forest,包括配置、接口定义和调用示例,还展示了POST请求、文件上传等常见场景。相比传统HTTP客户端,Forest具有声明简洁、功能完善的特点,特别适合微服务调用和第三方API对接,能显著提升开发效率和代码可维护性。

木头 426

基于matlab的主成分分析的人脸二维码识别系统

人脸识别因其在系统安全验证、信用验证、刑侦跟踪、身份管理、视频会议、人机交互、智能家居等方面的巨大应用前景,成为当前模式识别和人工智能领域越来越热门的一个研究方向。随着安全入口控制和二维码智能扫描应用需求的快速增长,基于二维码识别的生物人脸统计识别技术也引起了人们的重视。本案例将详细讲解基于主成分分析的人脸特征提取的原理与方法,并将其与 QR 二维码的编解码进行结合,将 MATLAB 作为工具平台,调用 QR 二维码编解码应用程序,进而实现一个人脸二维码自动识别的系统原型。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 976

【设计模式】责任链模式(Chain of Responsibility Pattern)

责任链模式()是将链中的每一个节点看做成一个对象,每个节点处理的请求均不同,且内部自动维护一个下一个节点对象,当一个请求从链式的首端发出时,会沿着链路的路径一次传递给每一个节点对象,直至有对象处理这个请求为止。责任链模式是一种行为型设计模式。...

老男孩的架构路 538

SAP Gateway Foundation OData V4 服务管理深度解析,从 Service Repository 到 Service Group 的完整运行逻辑

本文解析了SAP S/4HANA中OData V4 API的技术架构,重点阐述Service Repository、Service与Service Group的三层管理体系。以SalesOrder和PurchaseOrder API为例,说明不同服务可能属于特定repository(如srvd_a2x)而非默认DEFAULT库。Service Group作为业务模型组合单元,支持跨服务引用和统一配置,其发布状态直接影响服务可用性。文中对比了后台管理事务/IWBEP/V4_ADMIN与网关端/IWFND/V4

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 84

设计模式-责任链模式-Chain of Responsibility Pattern

创建一个抽象基类,定义处理请求的接口和设置下一个处理者的指针。

wesigj的博客 2385

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

设计模式中的责任链模式(Chain of Responsibility Pattern)

在软件开发中,经常会遇到需要按照顺序处理请求的情况,例如日志处理、权限控制、审批流程等。如果使用硬编码的 `if-else` 结构,代码将变得复杂且难以扩展。 **责任链模式(Chain of Responsibility Pattern)** 提供了一种**将请求的处理者组织成链式结构**的方法,使请求可以**沿着责任链传递,直到被某个处理者处理**,从而提高代码的灵活性和可扩展性。本文将详细介绍责任链模式的概念、应用场景,并通过 Python 代码示例展示其实现方式。

2491

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

设计模式之责任链模式(Chain of Responsibility Pattern)

What: 责任链模式也叫职责链模式。为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。 Why: 优点: 1.降低耦合度。它将请求的发送者和接收者解耦。 2.增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 缺点: 1.责任...

qq_37212210的博客 503

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java设计模式——责任链模式【Chain of Responsibility Pattern】

Java设计模式、责任链模式、Chain of Responsibility Pattern

scorpio的博客 1095

23种设计模式——责任链模式(Chain of Responsibility Pattern)

本文介绍了23种经典设计模式之——责任链模式(Chain of Responsibility Pattern)的使用及说明

Meteors.的博客 885

设计模式之责任链模式【Chain Of Responsibility Pattern】

当客户端发出一个请求,有多个对象都有机会来处理这个请求,但是客户端不知道究竟谁会来处理他的请求时,这是就可以使用责任链模式来处理这种情况。 1、定义 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。 2、使用场景 多个对象可以处理一个请求,但具体由哪个对象处理则在运行时动态决定。 在请求者不明确...

Rogera的博客 920

设计模式——责任链模式(Chain of Responsibility Pattern)+ Spring相关源码

每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

码鹿的记录 1014

设计模式:责任链模式(Chain of Responsibility Pattern)

责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。

TechNomad的博客 975

设计模式-12责任链模式Chain of Responsibility Pattern

责任链模式是一种行为设计模式,允许多个对象处理请求,避免请求发送者与接收者直接耦合。它将对象连成链,请求沿链传递直至被处理。适用于需要动态指定处理顺序、避免直接耦合的场景。结构包含处理者接口、抽象处理者和具体处理者。实现时,每个处理者决定是否能处理请求或传递给下一处理者。示例展示了采购审批流程,不同级别审批人根据金额限制处理请求,无法处理则转交上级。

d3y1`5 81_09 862

java设计模式---责任链模式(Chain of responsibility pattern)

java设计模式—责任链模式(Chain of responsibility pattern) 1. 概述 之前我们已经结束了创建型和结构型设计模式,接下来我们介绍行为型设计模式,行为型设计模式包含了11中,首先介绍的是责任链模式。该模式中包含了一些命令对象和一系列的处理对象,每一个对象都都保有对其下家的引用。如果我们将链中的每个节点看做是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从...

渔潭的博客 936

Java设计模式 十九 责任链模式 (Chain of Responsibility Pattern)

责任链模式通过将请求沿链传递,让多个对象有机会处理请求,避免了请求发送者与接收者的直接耦合。它使得对象的行为更加灵活,并且能够在不修改客户端代码的前提下,动态地改变处理流程。虽然责任链模式提供了更大的灵活性,但在链较长或处理较复杂时,可能导致处理效率降低,因此需要在适当的场景中使用。

空 1040

[设计模式] 责任链模式(Chain of Responsibility Pattern)

什么是责任链模式? 责任链模式是一种对象行为模式。顾名思义,责任链就是把承担不同责任的对象通过某种方式连接在一起形成一条链。当客户端把请求发送到这个责任链上的时候,本质上就是在链上不同的对象之间流转,直到链上的某个对象可以处理该请求,或者每个对象都处理该请求。 根据链上对象对请求的不同处理方式,责任链模式有两类: (1) 纯责任链模式 一个具体的处理者对象只能在两个行为中选择一个:要么承担全部责任,要么将责任推给下家。不允许出现某一个具体处理者对象在承担了一部分或者全部责任后,又将责任向下传递的情况。 一

asd13518662的博客 186

设计模式-责任链模式(Chain of Responsibility Pattern)

java 设计模式 责任链模式

weixin_43438824的博客 412
上一篇: 设计模式之策略模式
下一篇: Redis学习笔记
ludkjava
博客等级 码龄11年 173粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值