前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式-行为型模式-责任链模式

设计模式-行为型模式-责任链模式

原创
作者头像
mySoul
发布于 2018-12-07 12:03:36
发布于 2018-12-07 12:03:36
3180
举报
文章被收录于专栏:mySoulmySoul

设计模式-行为型模式-责任链模式

定义

将请求沿着链传递,然后直到对象处理即可。

UML图

代码

基本的责任链

代码语言:txt
AI代码解释
复制
public class Test{
	public void test(int i, Request request){
		if(i == 1){
			Hander1.response(request);
		}
		
		if(i == 2){
			Hander2.response(request);
		}
		
		if(i == 3){
			Hander3.requese(request);
		}
	}
}

代码逻辑如上,只处理1,2,3情况,其余的情况都不处理。

责任链

代码语言:txt
AI代码解释
复制
// 对象
public class Level{
	private int level = 0;
	public Level(int level){
		this.level = level;
	}
	public boolean above(Level level){
		if(this.level >= level.level)
			return true;
		else
			return false;
	}
}

// 将对象进行封装
public class Request{
	Level level;
	public Request(Level level){
		this.level = level;
	}
	public Level getLevel(){
		return level;
	}
}

// 返回消息
public class Response{}

public abstract class Handler{
	private Handler nextHandler;
	public final Response handleRequest(Request request){
		Response response = null;
		// 根据处理器的优先级处理,如果优先级高,处理
		if(this.getHandlerLevel().above(request.getLevel())){
			// 如果寻找到处理器,进行处理
			response = this.response(request);
		}else{
			// 否则,进入下一个处理器
			if(this.nextHandler != null){
				this.nextHandler.handleRequest(request);
			}else{
				System.out.println("没有合适的处理器");
			}
		}
		return response;
	}
	// 设置下一个处理器
	public void setNextHandler(Handler handler){
		this.nextHandler = handler;
	}
	// 当前处理器
	protected abstract Level getHandlerLvel();
	// 进入处理器处理
	public abstract Response response(Request request);
}

// 第一个处理器
public class ConcreteHandler1 extends Handler{
	protected Level getHandlerLevel(){
		return new Level(1);
	}
	public Response response(Request request){
		System.out.println("处理1处理");
		return null;	// 下一个处理器为空
	}
}

// 第二个处理器
public class ConcreteHandler2 extends Handler{
	protected Level getHandlerLevel(){
		return new Level(3);
	}
	public Response response(Request request){
		System.out.println("处理1处理");
		return null;	// 下一个处理器为空
	}
}

// 第三个处理器
public class ConcreteHandler3 extends Handler{
	protected Level getHandlerLevel(){
		return new Level(5);
	}
	public Response response(Request request){
		System.out.println("处理1处理");
		return null;	// 下一个处理器为空
	}
}

// 最后定义场景
public class Client{
	public static void main(String[] args){
		// 新建处理器
		Handler handler1 = new ConcreteHandler1();
		Handler handler2 = new ConcreteHandler2();
		Handler handler3 = new ConcreteHandler3();
		
		// 设置下一个处理器
		// 处理器处理逻辑为先处理1,再处理2,再处理3
		handler1.setNextHandler(handler2);
		handler2.setNextHandler(handler3);
		
		// 进行处理
		Response response = handler1.handlerRequest(new Request(new Level(4)));
	}
}

总结

责任链模式核心在处理流,让对象在类之间流动,直到合适进行对象处理,并把下一个设置为空。

写法,当然就是新建几个处理器类,然后要处理的对象,处理类之间用next指向下一个,然后把处理的对象传入进去,如果找到合适的处理器,进行处理,并将下一个设置为空,完成责任链。

其中,几个处理器类可以抽象出一个抽象类,并把对象进行封装成一个类,以上为上方代码的设计思路。

应用

开发一个电商网站,支付过500元定金的用户,收到100元优惠卷,200元收到50元,没有支付过的,进入普通模式购买。

如果不用职责链,需要写入一大堆if语句。

将if语句拆分,使用职责链,将处理器类抽象出来,然后将购买的用户传入处理器,然后如果处理完成,下一个设置为空,返回结果。

另外一个应用,文件上传,使用的也是职责链。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
斯坦福大学密码学-绪论 01
争取这周看完斯坦福大学Dan Boneh 教授的密码学课程,fighting !!!
Daffy
2020/11/02
1K0
通过云环境部署Hexo静态博客
建议在阅读本教程前先学会如何使用hexo。<font color=red>此教程不是零基础学会hexo系列。</font>
Dreamy.TZK
2020/04/03
4300
通过云环境部署Hexo静态博客
Unity3D基础项目(三):花费一天做个小游戏水果忍者
最近看了很多教程,代码方面大同小异,主要看思路,即编程思想。所以仿照着做了一款水果忍者,一天就够了。 开发工具:Unity3D(本人使用5.4版本),VS2015 周期:一天 准备:UI素材,声音段(素材来源于网络,如有侵权,请联系我删除)
孙寅
2020/06/02
2.3K1
Outlook技巧合并版
1.Outlook设置(详看各邮箱说明) 2.Outlook签名设置 1.png 2.png 3.Outlook清理邮件 邮箱大于2G就不能发送邮件,直接删除会丢失数据, 正确的办法是把服务器上
林万程
2018/06/26
1.8K0
【技术分享】机器学习之回归原理详述(一)
导语:本文用了从数学层面和代码层面,再结合一些通俗易懂的例子,详细地描述了回归主要涉及的原理和知识,希望对于机器学习的初学者或者有兴趣研究模型具体实现的同学带来一点帮助。
腾讯云TI平台
2019/08/27
6.7K0
【爬虫知识】浏览器开发者工具使用技巧总结
常见禁用开发者工具手段:https://blog.csdn.net/cplvfx/article/details/108518077
K哥爬虫
2021/08/03
2.5K0
【爬虫知识】浏览器开发者工具使用技巧总结
斯坦福大学密码学-流密码 02
有效加引号:理论上:必须在多项式时间内完成。应用上:在特定时间内完成(例如:一分钟内加密1G的数据)。
Daffy
2020/11/02
2K0
【技术分享】机器学习之SVM - 理论知识
导语:本文用一些简单的例子来解释了SVM是什么,然后通过SVM中最大间隔、核函数、软间隔、SMO四个关键部分,依次进行数学推导和解释。
腾讯云TI平台
2019/09/11
1.1K0
【字节跳动】第十五讲 微服务架构原理与治理实践| 青训营笔记
周余发:2018年硕士毕业,曾在美团点评研发效率中心、抖音服务架构担任系统开发。目前为字节跳动Service Mesh研发人员。
了凡银河系
2022/08/22
7870
【字节跳动】第十五讲 微服务架构原理与治理实践| 青训营笔记
tomcat通用回显链从0到1
Demo package com.naihe; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.B
红队蓝军
2022/03/25
4870
tomcat通用回显链从0到1
【字节跳动】第十六讲 走进消息队列| 青训营笔记
创建集群 --> 新增 Topic --> 编写生产者逻辑 --> 编写消费者逻辑
了凡银河系
2022/08/22
2K0
【字节跳动】第十六讲 走进消息队列| 青训营笔记
小程序物流快递单号查询接口对接指南
小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。也体现了“用完即走”的理念,用户不用关心是否安装太多应用的问题。应用将无处不在,随时可用,但又无需安装卸载。对于开发者而言,小程序开发门槛相对较低,难度不及APP,能够满足简单的基础应用,适合生活服务类线下商铺以及非刚需低频应用的转换,也比较适合初创公司创业阶段用来“试错”的产品,在开发成本、用户体验、运营方式、迭代更新方面小程序都很有优势。
用户4199839
2019/07/16
6.1K0
小程序物流快递单号查询接口对接指南
「玩转腾讯云」API网关+云函数SCF开启OAuth2.0认证实战
如果在按照教程测试的时候遇到服务调用失败的情况,可以直接跳到第五步,查看以下避坑指北呦!
shwinpiocess的技术之路
2020/06/04
2.4K0
Latex中也能展示动态图?
在学术领域,很多文档是用Latex做的,甚至有很多人用Latex Beamer来做PPT演示文稿。虽然在易用性和美观等角度来说,Latex Beamer很大程度上不如PowerPoint,但是Beamer这种浓厚的学术色彩还是受到了很多人的喜好。但是我们知道Latex生成的文档一般是用pdf格式来存储的,如果放一个gif动态图进去,就可能会变成一个静态图,那就没办法展示整个动态的过程了。幸运的是,Latex还有一种比较麻烦的方法,对动态图也做了一定的支持。本文所使用的案例,是一个比较热门的猴痘病毒蛋白的松弛过程。碍于动态图比较大,在博客里面放不下,故只能用这种链接索引+静态图展示的方案。
DechinPhy
2022/10/05
6620
Latex中也能展示动态图?
Zabbix 企业级分布式监控
在 部 署 Zabbix Server 之 前 , 首 先 要 配 置 LNMP 环 境 , LNMP 是 Linux+Nginx+MySQL+PHP 的简写,是 Linux 系统下常用的 php 脚本语言运行环境。
不凡
2021/08/04
7130
Zabbix 企业级分布式监控
鹅厂优文 | 企点PC端性能测试-UI卡顿分析
本文以一个企点融合工作台测试中发现的案例说明如何获得UI卡顿数据,以及如何分析数据,定位问题。
鹅厂优文
2018/04/02
4.5K9
鹅厂优文 | 企点PC端性能测试-UI卡顿分析
斯坦福大学密码学-分组密码 03
典型的分组密码以迭代的形式构建。输入密钥k,然后将密钥扩张成一系列的回合密钥 到 。使用这些回合密钥一次又一次的迭代使用回合函数加密明文信息。
Daffy
2020/11/03
2K0
怎样压缩PDF文件大小?简单的步骤是什么?
  PDF文件传输的时候经常因为PDF文件太大无法进行传输,遇到这样的情况我们应该怎样将其进行压缩呢?其实很简单,我们可以借助来进行实现,下面将PDF文件压缩的方法分享给大家,希望可以帮助到有需要的朋友!
用户4838056
2019/07/22
1.4K0
怎样压缩PDF文件大小?简单的步骤是什么?
第三章:UltraiSO制作启动u盘+制作winPE镜像+硬盘安装系统
天蝎座的程序媛
2023/10/17
3.3K0
第三章:UltraiSO制作启动u盘+制作winPE镜像+硬盘安装系统
[原创]PC微信逆向分析のWeTool内部探秘
先不说微信在社交领域的霸主地位,我们仅从腾讯公司所透露的在研发微信过程中踩过的无数的坑,以及公开的与微信相关的填坑的源代码中,我们可以感受到,单从技术上讲,微信是一款非常伟大的产品。然而,伟大的产品,往往会被痴迷于技术的人送进实验室大卸八块,以参悟其伟大之所在!
用户2820087
2019/09/14
2.8K0
[原创]PC微信逆向分析のWeTool内部探秘
推荐阅读
相关推荐
斯坦福大学密码学-绪论 01
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档