JAVA架构师之路十六:设计模式之责任链模式

article/2025/9/29 11:10:40

JAVA架构师之路十五:设计模式之策略模式

责任链模式

    • 1. 责任链模式
    • 2. 登陆案例
    • 3. 登陆案例优化

人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得到最后的奖杯。

1. 责任链模式

定义

责任链模式是将链中每一个节点看作是一个对象,每个节点请求处理的请i去均不同,且内部自动维护一个下一个节点对象。当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象。直至有对象处理这个请求为止。

属于行为型模式

适用场景

多个对象可以处理同一个请求,但具体由哪个对象处理,则在运行时动态决定。

在不明确指定接收者的情况下,向多个对象中的一个提交一个请求

可动态指定一组对象处理请求。

优点

将请求与处理解耦

请求处理者(节点对象)只需关注自己感兴趣的请求进行处理即可,对于不感兴趣的请求,直接转发给下一级节点对象;

具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果

链路结构灵活,可以通过改变连句结构动态地新增或者删见责任;

易于扩展新的请求处理类(节点),符合开闭原则

缺点

责任链太长或者处理时间过长,会影响整体性能

如果节点对象存在循环引用时,会造成死循环,导致系统崩溃

2. 登陆案例

大部分的网站都需要登陆,一般的登陆流程都需要先校验输入的用户名密码是否合法,再者校验用户是否存在,然后再校验权限等等。

public abstract class Handler {protected Handler next;public void next(Handler next) {this.next = next;}public abstract void doHandler(Member member);}
public class ValidateHandler extends Handler {@Overridepublic void doHandler(Member member) {if (StringUtils.isBlank(member.getLoginName()) || StringUtils.isBlank(member.getLoginPass())) {System.out.println("用户名或者密码为空!");return;}System.out.println("用户名密码不为空,可以往下执行");next.doHandler(member);}
}
public class LoginHandler extends Handler {@Overridepublic void doHandler(Member member) {System.out.println("登陆成功");member.setRoleName("管理员");next.doHandler(member);}
}
public class AuthHandler extends Handler {@Overridepublic void doHandler(Member member) {if(!"管理员".equals(member.getRoleName())) {System.out.println("您不是管理员,没有操作权限");return;}System.out.println("允许操作");}
}
public class MemberService {public void login(String loginName, String loginPass) {ValidateHandler validateHandler = new ValidateHandler();LoginHandler loginHandler = new LoginHandler();AuthHandler authHandler = new AuthHandler();validateHandler.next(loginHandler);loginHandler.next(authHandler);validateHandler.doHandler(new Member(loginName, loginPass));}
}
public class Test {public static void main(String[] args) {MemberService memberService = new MemberService();memberService.login("tom", "123456");memberService.login("tom", null);}
}
用户名密码不为空,可以往下执行
登陆成功
允许操作
用户名或者密码为空!

在这里插入图片描述

3. 登陆案例优化

MemberService中有一些validateHandler.next(loginHandler);loginHandler.next(authHandler);的操作,这样其实很烦,因为你必须要知道上下文才能把整个链路串起来,那么想到以前的Builder模式,可以优化一下:

public abstract class Handler {protected Handler next;public void next(Handler next) {this.next = next;}public abstract void doHandler(Member member);public static class Builder {private Handler head;private Handler tail;public Builder  addHandler(Handler handler) {if(this.head == null) {this.head = this.tail = handler;return this;}this.tail.next = handler;this.tail = handler;return this;}public Handler build(){return this.head;}}
}
public class MemberService {public void login(String loginName, String loginPass) {Handler.Builder builder = new Handler.Builder();builder.addHandler(new ValidateHandler()).addHandler(new LoginHandler()).addHandler(new AuthHandler());builder.build().doHandler(new Member(loginName, loginPass));}
}

内部维护一个链路,只需要调用add方法就能往里面添加链路了。
感谢您阅读本文,如果您觉得文章写的对您有用的话,请您点击上面的“关注”,点个赞,这样您就可以持续收到《JAVA架构师之路》的最新文章了。文章内容属于自己的一点点心得,难免有不对的地方,欢迎在下方评论区探讨,你们的关注是我创作优质文章的动力。


http://chatgpt.dhexx.cn/article/COqTVOgM.shtml

相关文章

BAT面试高级进阶,Java架构师之路

说明 Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在分布式事务的问题。 业界有很多的解决方案,对此我相信大家都百度一下…

JAVA架构师之路-视频学习

https://pan.baidu.com/s/1GK-HNdG_HsNTb_QQ6_L3Tg 目录: 第一套 JAVA高级架构师之旅 第2套 Java互联网架构师netty、mina、nio 第三套 阿里开源Dubbo 【第四套】互联网综合实战项目介绍 【第五套】高性能缓存Memcached服务深度原理及实战视频课程 【第六套】高级J…

JAVA架构师之路十五:设计模式之策略模式

JAVA架构师之路十四:设计模式之模板模式 策略模式 1. 策略模式2. 优惠券案例3. 支付案例 人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得到最后的奖杯。 1. 策略模式 定义 策略模式…

走向Java架构师之路:成为架构师要掌握的8大能力

架构师是什么?是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清单。 如何才能达到Java架构师技术要求标准?Java架构师需要熟练…

JAVA架构师之路十一:设计模式之适配器模式

JAVA架构师之路十:设计模式之组合模式 适配器模式 1. 适配器模式2. 类适配器写法3. 对象适配器写法4. 接口适配器写法 钟表,可以回到起点,但已不是昨天。 生活中处处可见适配现象:手机充电器的充电头,电脑电源适配器&…

Java架构师:概述

一、Java架构师核心技术栈 二、架构师需要具备的其他能力 三、技术选型 四、早期传统JavaWeb开发模式 五、前后端分离开发模式 六、Maven聚合项目 七、数据库设计工具PDMan 八、数据库外键弊端【移除物理外键,而非逻辑外键】 数据库表与表之间字段间不要有物理外键…

Java架构师之路:微服务架构图解和详情

微服务框架搭建: 总体规划框架名称当前技术选型方案微服务框架搭建 开发框架 单体服务SpringBoot 分布式框架SpringCloud 最新框架SpringCloudAlibaba 服务配置中心 服务消息总线 阿里巴巴Nacos、 ConfigBusRabbitMQ配合使用、 携程apolo 服务网关 Spr…

java架构师进阶之路

要想进阶为架构师,不仅要有知识广度,还要有深度。 最近把今天收集的java学习资料整理了下,里面包含了计算机基础、算法和数据结构、常用工具、java核心知识、性能优化、基础框架、数据库、消息队列、缓存中间件、搜索引擎、大数据、RPC、网关…

通往Java架构师之路

Java架构师,应该算是一些Java程序员们的一个职业目标了吧,很多码农码了五六年的代码也没能成为架构师。那成为Java架构师要掌握哪些技术呢,总体来说呢,有两方面,一个是基础技术,另一个就是组织能力和提出解决方案能力。…

如何成为Java架构师?学习路线是怎样的?大佬总结成长之路跟着往上走,建议你提早开始准备!

导读 好程序员告诉你Java架构师学习路线,从初级Java工程师成长为Java架构师,你需要走很长的路,很多有计划的人在学习之初就在做准备。你知道Java架构师学习路线该怎么走吗?成为一个优秀的Java架构师究竟需要学什么?接下来就跟小编一起揭晓…

从三方面分析,Java程序员如何晋升为高薪Java架构师?

对于工作多年的程序员而言,日后的职业发展无非是继续专精技术、转型管理和晋升架构师三种选择。下面,我从架构师在一家公司有多重要、优秀架构师需要具备怎样的素质以及架构师的发展现状三个方面来分析,Java程序员如何才能晋升为优秀的高薪Java架构师? 希望通过本文我的分…

getByte()用法小结

在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同情况下,返回的东西不一样! String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如&a…

java中String的getByte()方法

Java getBytes() 方法 Java String类 getBytes() 方法有两种形式: getBytes(String charsetName): 使用指定的字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。getBytes(): 使用平台的默认字符集将字符串编码为 byte 序列&#…

JAVA中的getBytes方法

在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同情况下,返回的东西不一样! String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如&a…

JAVA中的getBytes()方法

在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同情况下,返回的东西不一样! String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如&a…

Java数组作业题

计算一维数组中最大值和最小值的数据之和; package org.oracle.test;public class Arr01 {public static void main(String[] args) {int[] arr { 6, 3, 2, 7, 9, 1, 5, 4, 4, 4, 10, 9 };int max arr[0];int min arr[0];for (int i 1; i < arr.length; i) {if (max &l…

Oracle、hive、Hbase基本操作

文章目录 Oracle基本操作概述库相关备份库还原库 表相关数据相关 hive基本操作库相关表相关表操作 Hbase基本操作概述操作 Oracle基本操作 概述 Oracle 一般创建一个全局库&#xff0c;可以但不建议创建多个库Oracle 一个用户是一个库&#xff0c;创建不同的库就要创建不同的…

数据库:Oracle和MySQL

关系型数据库 概念 关系数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型由关系数据结构、关系操作集合、关系完整性约束三部分组成。简单说&#xff0c;关系型数据库是由多张能互相联接的二维行…

Oracle SQL学习笔记

参考&#xff1a;FreeIT-Oracle教程 实用sql 0.1、update内容中含有单引号 方案&#xff1a;用两个单引号代替一个单引号 select to_char(aa否aa) from dual;--aa否aa 0.2、找表 -- 找表 select a.OWNER 表所属用户,a.TABLE_NAME 表明,a.* from all_tables a where a.TABL…

oracle取第二大的值,【Oracle】oracle取最大值和最小值的几个方法汇总

(1)oracle使用keep分析函数取最值记录 -- 取工资sal最大的雇员姓名及其工资,以及工资sal最少的雇员姓名及其工资 select deptno, empno, ename, sal, max(ename) keep(dense_rank FIRST order by sal) over (partition by deptno) as min_sal_man, max(sal) keep(dense_rank F…