设计模式-责任链模式

news2024/11/19 11:19:49

一、知其然

        责任链字面含义第一联想到的就是他是一个链式的行为,就像一个链条一样把所产生的动力传输到到齿轮上一样;还有类似生活中的一个游戏“击鼓传花”,这样说好像也是泛泛而谈,来看看度娘的官方概念(摘自百度百科):

责任链模式_百度百科责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。https://baike.baidu.com/item/%E8%B4%A3%E4%BB%BB%E9%93%BE%E6%A8%A1%E5%BC%8F/5295498?fromModule=lemma_inlink        嗯看完大概有点朦胧的概念了,下面开始细说一下这种设计模式的特点。

二、知其所以然

2.1、核心特点

2.1.1、特点一 抽象处理接口(AbstractHandler

        一般他定义了需要子类去实现的核心方法,还有一个成员变量代表下一个节点的引用。大概样子就是长这样:

UML图:

 

 代码样子(简单例子便于方便理解):

package com.chain.test;

/**
 * 抽象处理接口
 *
 */
public abstract class AbstractHandler {
	/**链式引用*/
	AbstractHandler next;
	/**抽象行为方法留给子类去实现*/
	protected abstract void handlerRequest();
	
	public AbstractHandler getNext() {
		return next;
	}
	public void setNext(AbstractHandler next) {
		this.next = next;
	}
	
}

2.2、特点二 具体处理者(ConcreteHandler

        具体处理业务逻辑的处理实现类它的核心特点其实就是接收请求要么处理要么丢给下一个处理者。

UML图:

 代码样子(简单例子便于方便理解):

package com.chain.test;

/**
 * 具体责任链处理者实现类
 *
 */
public class ConcreteTypeHandler extends AbstractHandler {

	@Override
	protected boolean handlerRequest(String params) {
		if("one".equals(params)) {
			System.out.println("第一个处理者");
			return Boolean.TRUE;
		}else {
			if(super.getNext()!=null) {
				System.out.println("下一个处理者不为空传递给下一个处理者");
				return super.getNext().handlerRequest(params);
			}
		}
		return Boolean.FALSE;
	}

}
package com.chain.test;

/**
 * 具体责任链处理者实现类
 *
 */
public class ConcreteBusinessHandler extends AbstractHandler {

	@Override
	protected boolean handlerRequest(String params) {
		if("two".equals(params)) {
			System.out.println("第二个处理者");
			return Boolean.TRUE;
		}else {
			if(super.getNext()!=null) {
				System.out.println("下一个处理者不为空传递给下一个处理者");
				return super.getNext().handlerRequest(params);
			}
		}
		return Boolean.FALSE;
	}

}

是不是觉得有点感觉和思路了,下面实际跑一个demo验证下。

三、行是知之始,知是行之成

        上面我们简单介绍了适配器模式的特点,下面我们针对以上代码来编写一个demo这样就能更深入的理解对应的特点;废话不多说直接上代码(这里实际沿用了上面编写的大部分框架,只编写实际测试类)。

package com.chain.test;

/**
 * 具体责任链处理者实现类
 *
 */
public class ConcreteBusinessHandler extends AbstractHandler {

	@Override
	protected boolean handlerRequest(String params) {
		if("two".equals(params)) {
			System.out.println("第二个处理者");
			return Boolean.TRUE;
		}else {
			if(super.getNext()!=null) {
				System.out.println("下一个处理者不为空传递给下一个处理者");
				return super.getNext().handlerRequest(params);
			}
		}
		return Boolean.FALSE;
	}

}

相信大家看完后表情肯定是这样的,开个玩笑放松一下,是的就是这么简单,实际中大家可以根据自己的诉求更换入参以及返回值做到灵活使用。

四、不待思量,过耳便晓

        前面我们说了这个设计模式有些特点,就是他有一个抽象行为定义,以及指向下一个节点的引用,实际继承抽象行为的只需要实现自身关注的行为就好了,大概他的最终UML关系就是这样。

 

        这时候有人会说你说了这么多也没觉得它有多好,其实实际如果不用设计模式的话有人就会用IF ELSE来代替这些处理场景,不是说IF ELSE 不能处理这种系统流程判断,而是实际中IF ELSE更适合判断计算逻辑;责任链完美的诠释了开闭原则和单一原则,松散的耦合也更利于代码扩展和维护。

五、路漫漫其修远

        最后希望大家看完文章后对自己有深入的收获,没有什么完美的设计模式,只是说有适合的场景中去合理利用;加入设计模式的目的并不是说为了炫技,代码的最终目的还是为了解决实际问题,甚至也是向完美艺术的升华。

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

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

相关文章

[每周一更]-(第26期):反爬虫机制

随着网站的越来越普及,我们开发出来的知识类网站更不希望被竞争对手爬虫,虽然现在网络中充斥着各种各样的蜘蛛,有合法的浏览器爬虫,以及不合法 的人为爬虫,所以攻防战一直都存在,我们只能更好的设定规则&am…

中文文本分类

手把手带你做一个文本分类实战项目(模型代码解读) https://www.bilibili.com/video/BV15Z4y1S7aR/?spm_id_from333.788.recommend_more_video.-1&vd_sourcec47fbb8166930edc486d8fdc405bf569 中文汉字对应的数字索引 之后对应的数字索引 之后找到tokn embedding的东西 1…

34. 池化层 / 汇聚层

1. 池化层 如果我们拍摄黑白之间轮廓清晰的图像X,并将整个图像向右移动一个像素,即Z[i, j] X[i, j 1],则新图像Z的输出可能大不相同。而在现实中,随着拍摄角度的移动,任何物体几乎不可能发生在同一像素上。即使用三脚…

15【SpringMVC的注解开发】

文章目录二、SpringMVC注解支持2.1 回顾Servlet容器启动源码流程2.2 分析SpringMVC启动源码分析2.2.1 SpringServletContainerInitializer源码分析2.2.2 WebApplicationInitializer源码分析1)AbstractContextLoaderInitializer2)AbstractDispatcherServl…

短视频播放量超10w后,流量变少的问题解决方案

短视频播放量超10w后,流量变少的问题解决方案 上一篇我们聊了视频播放超10w后,会遇到流量变少的问题并分析了可能的原因,既然知道了原因,那么我们就可以针对性的去解决了。 今天给大家聊一聊在我赢助手跟超200名短视频创作者沟通…

Allegro如何设置差分动态等长规则操作指导

Allegro如何设置差分动态等长规则操作指导 Allegro上可以对差分设置动态等长规则,让差分对在任意一段距离上都是满足等长误差的,尤其是在差分对走线较长的情况下 以下面这两对线为例 具体操作如下 打开constraint Manage选择Physical规则

Linux 管理联网 设置主机名( nmtui图形化 和 hostnamectl命令 )

设置主机名 # 常用的有两种方式,一种是 nmtui 图形化界面的方式来设置, 一种是 hostnamectl 命令的方式来设置。 nmtui 直接在命令行 输入 nmtui 便进入 图形化界面 >>> 最后一选项( 红底) 便是 设置主机名~&#x…

微导纳米科创板上市:市值125亿 无锡首富王燕清再敲钟

雷递网 雷建平 12月23日江苏微导纳米科技股份有限公司(简称:“微导纳米”,股票代码为:“688147”)今日在科创板上市。微导纳米此次发行4544.55万股,发行价为24.21元,募资总额为11亿元。微导纳米…

react笔记_11 redux

目录redux定义使用时机redux基本概念StoreStateActionreducerredux工作原理语法[1] 创建StorecreateStorecombineReducers[2]创建并分发actiondispatchapplyMiddleware语法举例说明- 做一个加法运算执行原理redux-thunk中间件使用[3]创建reducer语法渲染过程[4]getState[5]subs…

基于meanshift算法的目标聚类和目标跟踪matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 meanshift算法其实通过名字就可以看到该算法的核心,mean(均值),shift(偏移),简单的说,也就是有一个…

Web前端105天-day63-HTML5_CORE

HTML5CORE03 目录 前言 一、复习 二、SVG 三、Echarts 四、Webworker 五、回调地狱 六、Promise 七、promiseajax 八、promise_axios 九、async_await 总结 前言 HTML5CORE03学习开始 一、复习 跨域 浏览器的同源策略限定: 网页中利用 AJAX 请求数据, 必须访问同源…

【CSS】flex布局用法解析,快速上手flex布局,flex:1是什么意思?肯定看的懂好吧?

一、flex布局 flex 是 flexible box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。 任何一个容器都可以指定为 flex 布局。 采用 flex 布局的元素,称为 flex 容器(flex container),…

如何解决跨越

解决跨域我想在坐的各位都会听说过几个解决跨域的方法: 1.有什么 cors后端配置(加几个请求头 2.jsonp(利用script的src属性) 3.还有vue-cli前端配置。 跨域其实就是违背了浏览器的一种策略,这种策略就是同源策略&…

公司刚来的阿里p8,看完我构建的springboot框架,甩给我一份文档

前言: 我们刚开始学习 JavaWeb 的时候,使用 Servlet/JSP 做开发,一个接口搞一个 Servlet ,很头大,后来我们通过隐藏域或者反射等方式,可以减少 Servlet 的创建,但是依然不方便,再后…

【Transformer】医学分割领域的应用与扩展(论文阅读)(二) || DETR

声明:仅学习使用~ 目录 1. Transformer学习2. DETR1. Transformer学习 前篇指路:【Transformer】医学分隔领域的应用与扩展(论文阅读)(一) 继续… 关于Self-Attention的公式: 原来是 m x m 是2D的,现在变成1 x m了,是1D的了。 下图中。左图是传统的Transformer,右…

【python圣诞树的实现】

🤵‍♂️ 个人主页老虎也淘气 个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏…

拒不外传,阿里内部耗重金找人总结出这份并发编程手册(全彩版)

并发世界很有趣,不要错过 前言: 时间飞逝,转眼间毕业七年多,从事 Java 开发也六年了。我在想,也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开…

python常用模块

time模块 常用操作 1.直接获取时间 time.time() #获取结果是秒数,即从1970年1月1日8:00起计#1671856010.9592516 2.获取结构化时间 time.localtime() #获取本地时间,中国为东八区,为上海时间 time.gmtime() …

C++控制台圣诞树

前言 有是一年圣诞节,先祝大家圣诞节快乐,所以本蒟蒻在AFO之后决定回来更新一篇打印字符圣诞树的教程 (呃好吧我承认我就是想嫖奖品) 效果展示 呃我知道这有点拉,但是……蒟蒻能有什么坏心思呢,他只不过想…

客户端服务端交互实现

问题 客户端业务逻辑如何实现? 与服务设备具体交互细节如何设计? 客户端业务逻辑实现 用户输入处理 字符串空格处理,分割获取命令与参数 服务信息处理 字符串预处理,分割获取服务命令存储服务命令与设备地址之间的映射(命令字…