【设计模式】—-(22)责任链模式(行为型)

关于两个设计模式的心得----模版方法模式、责任链模式 最近在做一个蓝牙稳定性的自动化测试工具,就是用app模拟人的行为,自动去跑一些蓝牙相关的测试用例,譬如间隔传输数据、传输大数据、反复开关蓝牙等,再加上不同的参数配置,一共加起来大概有30多个case要跑,并且需要这些case串行执行,就是一个case跑完了才能执行下一个。这个时候如果没有一个设计框架在里面,直接硬编码实现每一个case会无比混乱,尤其是想实现串行执行会很麻烦。所以搞了一套框架,主要 阅读详情
一、定义(概念)
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。


二、适用场景


1 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2 你想在不明确指定接受者的情况下,想过个对象中的一个提交一个请求。
3 可处理一个请求的对象集合应该被动态指定。
  
涉及角色:
         ●  抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
   ●  具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。


三、UML

四、代码

package chainOfResp;
/**
 * 
 *作者:Singit
 *时间:
 *描述:抽象处理角色
 */
public abstract class Handler {

	protected Handler successor;
	/**
	 * 
	 *作者:Singit
	 *时间:
	 *描述:处理方法
	 */
	public abstract void handlerRequest(String condition);
	
	
	public Handler getSuccessor() {
		return successor;
	}
	public void setSuccessor(Handler successor) {
		this.successor = successor;
	}	
	
}
 
package chainOfResp;
/**
 * 
 *作者:Singit
 *时间:
 *描述:具体处理角色
 */
public class ConcreteHandler1 extends Handler {

	@Override
	public void handlerRequest(String condition) {
		// 如果是自己的责任,就自己处理,负责传给下家处理
		if(condition.equals("ConcreteHandler1")){
			System.out.println( "ConcreteHandler1 handled ");
			return ;
		}else{
			System.out.println( "ConcreteHandler1 passed ");
			getSuccessor().handlerRequest(condition);
		}
	}

}
 
package chainOfResp;
/**
 * 
 *作者:Singit
 *时间:
 *描述:具体处理角色
 */
public class ConcreteHandler2 extends Handler {
	
	@Override
	public void handlerRequest(String condition) {
		// 如果是自己的责任,就自己处理,负责传给下家处理
		if(condition.equals("ConcreteHandler2")){
			System.out.println( "ConcreteHandler2 handled ");
			return ;
		}else{
			System.out.println( "ConcreteHandler2 passed ");
			getSuccessor().handlerRequest(condition);
		}
	}

}
 
package chainOfResp;
/**
 * 
 *作者:Singit
 *时间:
 *描述:具体处理角色
 */
public class ConcreteHandlerN extends Handler {

	/**
	 * 这里假设n是链的最后一个节点必须处理掉
	 * 在实际情况下,可能出现环,或者是树形,
	 * 这里并不一定是最后一个节点。
	 * 
	 */
	@Override
	public void handlerRequest(String condition) {

		System.out.println( "ConcreteHandlerN handled");
		
	}

}
 
package chainOfResp;
/**
 * 
 *作者:Singit
 *时间:
 *描述:测试类
 */
public class Client {

	/**
	 *作者:Singit
	 *时间:
	 *描述:
	 */
	public static void main(String[] args) {
	
		Handler handler1 = new ConcreteHandler1();
		Handler handler2 = new ConcreteHandler2();
		Handler handlern = new ConcreteHandlerN();
		
		//链起来
		handler1.setSuccessor(handler2);
		handler2.setSuccessor(handlern);
		
		//假设这个请求是ConcreteHandler2的责任
		handler1.handlerRequest("ConcreteHandler2");
		
		
	}

}
 
举这样一个例子,在玩具工厂的生产车间,流水线就是一条责任链,假如一个玩具飞机有外壳装配员,引擎装配员,螺旋桨装配员,模型包装员组成。当这个物件飞机流到谁那里,谁就负责安装他负责的这一部分,这部分安装完成后流到下一个环节,知道所有环境完成。这个是一生成的责任链。还有一个质量检测链,质量检测也分多部,外壳检测,引擎检测,螺旋桨检测,包装检测。当产品留到检测员那里检测自己负责的那一块,如果有问题直接拎出来,如果没问题则传给下一个检测员,直到所有检测完成。这两个都是责任链,但是区别是,生成责任链每个人都会处理,并处理一部分;而质量检测责任链经过判断,要么处理掉,要么不处理流下去。这就是责任链的两种分类,后一种叫做纯的责任链,前一种叫做不纯的责任链,纯的责任链在实际应用中很少存在,常见的为不纯的责任链,上面的模型是模拟纯的责任链来处理的。
 
责任链模式在现实中使用的很多,常见的就是OA系统中的工作流。 在java中的实际应用有Servlet中的过滤器(Filter),Struts2的拦截器(Interceptor)。Struts2本身在Servlet中也是以Filter的形式出现的,所以Struts2的结构图中,也可以明显看出Filter和Interceptor这两条链的存在。

  可以看出它们每个节点都可以做一些事情,所以不算一个纯的责任链。
在上面提到了OA系统,那么我们再模拟一下OA系统中请假审批流程,假如员工直接上司为小组长,小组长直接上司项目经理,项目经理直接上司部门经理,部门经理直接上司总经理。公司规定请假审批如下:
请假时间为t,时间单位day,简写d:
t<  0.5d,小组长审批;
t>=0.5d,t<2,项目经理审批;
t>=2,t<5部门经理审批;
t>=5总经理审批;
审批时序图如下:
用代码描述:  
package chainOfResp.example;
/**
 * 
 *作者:alaric
 *时间:2013-8-17下午1:02:51
 *描述:审批处理抽象类
 */
public abstract class Handler {

	protected Handler handler;

	/**
	 * 
	 *作者:Singit
	 *时间:
	 *描述:审批
	 */
	public abstract boolean approve(double day);
	
	public Handler getHandler() {
		return handler;
	}
	public void setHandler(Handler handler) {
		this.handler = handler;
	}
	
}
 
package chainOfResp.example;


public class GroupLeader extends Handler {

	@Override
	public boolean approve(double day) {
		if(day<0.5){
			System.out.println("小组长审批通过");
			return true;
		}else {
			System.out.println("小组长传给了他的上司");
			return getHandler().approve(day);
		}
	}


}
 
package chainOfResp.example;


public class ProjectManager extends Handler {

	@Override
	public boolean approve(double day) {
		if(day<2){
			System.out.println("项目经理审批通过");
			return true;
		}else {
			System.out.println("项目经理传给了他的上司");
			return getHandler().approve(day);
		}
	}


}
 
package chainOfResp.example;


public class DepartmentManager extends Handler {

	@Override
	public boolean approve(double day) {
		if(day<5){
			System.out.println("部门经理审批通过");
			return true;
		}else {
			System.out.println("部门经理传给了他的上司");
			return getHandler().approve(day);
		}
	}


}
 
package chainOfResp.example;


public class CEO extends Handler {

	@Override
	public boolean approve(double day) {
			System.out.println("部门经理审批通过");
			return true;
		
	}

}
 
package chainOfResp.example;
/**
 * 
 *作者:Singit
 *时间:
 *描述:测试类,首先来创建责任链,然后发出请求模拟员工来请假
 */
public class Client {

	/**
	 *作者:alaric
	 *时间:2013-8-17下午12:54:44
	 *描述:
	 */
	public static void main(String[] args) {

		//创建节点
		GroupLeader gl = new GroupLeader();
		ProjectManager pm = new ProjectManager();
		DepartmentManager dm = new DepartmentManager();
		CEO ceo = new CEO();
		//建立责任链
		gl.setHandler(pm);
		pm.setHandler(dm);
		dm.setHandler(ceo);
		
		//向小组长发出申请,请求审批4天的假期
		gl.approve(4D);
		

	}

}
  运行结果:
小组长传给了他的上司
项目经理传给了他的上司
部门经理审批通过
 
这里模拟的是一个理想的状态,所以是一个纯的责任链;在实际当中,可能小组长签字,项目经理签字...一堆的签字,而不是不参与请求的处理。
责任链模式的优点是调用者不需知道具体谁来处理请求,也不知道链的具体结构,降低了节点域节点的耦合度;可在运行时动态修改链中的对象职责,增强了给对象指派职责的灵活性;缺点是没有明确的接收者,可能传到链的最后,也没得到正确的处理。

五、小结(优点与缺点)

优点:

因为无法预知来自外界(客户端)的请求是属于哪种类型,每个类如果碰到它不能处理的请求只要放弃就可以。

职责链灵活在哪
1. 改变内部的传递规则
每个人都可以去动态地指定他的继任者。
2. 可以从职责链任何一关开始。

3.用与不用的区别
不用职责链的结构,我们需要和公司中的每一个层级都发生耦合关系。
如果反映在代码上即使我们需要在一个类中去写上很多丑陋的if….else语句。
如果用了职责链,相当于我们面对的是一个黑箱,我们只需要认识其中的一个部门,然后让黑箱内部去负责传递就好了

缺点:

1、对于每一个请求都需要遍历职责链,性能是个问题;效率低,因为一个请求的完成可能要遍历到最后才可能完成;扩展性差,因为在COR中,一定要有一个统一的接口处理程序局限性就在这里。
2、抽象处理者 AbstractHandler 类中的 handleRequest() 方法中使用了递归,栈空间的大小也是个问题。
 个人看法:
职责链模式对于请求的处理是不知道最终处理者是谁,所以是运行动态寻找并指定;而命令模式中对于命令的处理时在创建命令是已经显式或隐式绑定了接收者。

六、总结:

纯的与不纯的责任链模式
  一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又 把责任向下传的情况。
在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。


  纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。但是在实际的系统里,纯的责任链很难找到。如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大意义了。
责任链模式在Tomcat中的应用
众所周知Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口。


责任链模式详解附有代码案例分析(包含责任链模式与建造者模式的结合代码案例) 责任链模式一、责任链模式的概念与角色(一)、责任链模式的概念(二)、责任链模式的角色二、责任链模式的应用场景三、无使用责任链模式的代码示例四、使用责任链模式的代码示例五、责任链模式与建造者模式的结合六、责任链模式的优缺点(一)、责任链模式的优点(二)、责任链模式的缺点 一、责任链模式的概念与角色 (一)、责任链模式的概念 ​ 责任链模式是将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象 阅读详情

相关推荐

驻极体咪头信号采集避坑指南:如何用5V单电源搞定0.1mV~1V的音频放大?

本文针对驻极体咪头(ECM)在5V单电源系统中信号采集的常见难题,提供了详细的电路设计指南。文章深入分析了咪头的高输出阻抗与微弱信号特性,重点阐述了采用两级运放(如AD8542)实现低噪声放大、直流偏置叠加以及抗混叠滤波的完整方案,并分享了PCB布局、电源去耦等关键调试技巧,帮助工程师稳定采集0.1mV至1V的音频信号。

weixin_29291069的博客 437

责任树模式(责任链模式+策略模式的组合)

1 问题背景 最近开发了一个需求,该接口需要根据 p1、p2、p3、version 多个入参的不同组合按照其对应的业务策略给出结果数据。由于该接口已经开发了三期了,每次开发新一期的需求时为了兼容老的业务逻辑,大家都倾向于不删不改只新增,因此这块代码已经产生了一些「坏味道」,函数入口通过不断添加「卫语句」判断 version 的方式跳转到新一期的业务逻辑方法中,而每一期的业务逻辑也是通过 p1、p2、p3 的 if-else 组合形成不同的分支逻辑。这已经是我简化后的表述,总之刚开始对于我这个新同学来说,梳

lzf的博客 1万+

奥顺居PHP测算引流SEO程序_八字风水_起名解梦_星座生肖综合门户源码

奥顺居PHP测算引流SEO程序_八字风水_起名解梦_星座生肖综合门户源码 S30新框架适合多种奥顺插件。

xl1407的博客 1751

责任链模式综述(基础篇)

本篇综述责任链模式的提出动机、原理结构、典型实现和应用场景,并结合实例展现了其灵活性和可插拔性。首先,结合生活中“打扑克”的例子引出了责任链模式动机和应用场景,然后我们概述了责任链模式的内涵和结构,即通过建立一条责任链来组织请求的处理者,请求将沿着链进行传递,而请求发送者无须知道请求在何时、何处以及如何被处理,实现了请求发送者与处理者的解耦。最后给出了责任链模式的典型实现和并结合具体实例介绍其使用方式,以便体会其优点

Rico's Blogs 1万+

【电驱动】永磁同步电机工作原理及分类

永磁同步电机工作原理及分类

星Yeah 的博客 7329

向量乘法器设计

同样基于Wallace树乘法器,我们来构造向量乘法器。 在一些矩阵运算中经常用到向量的相乘运算,本例以4维向量为例子介绍向量乘法器的verilog HDL设计。 设向量a = (a1, a2, a3, a4), b = (b1, b2, b3, b4)。 则a 与 b的点乘为:a * b = a1 b1 + a2 b2 + a3 b3 + a4 b4, 即向量对应位置的值相乘,再相加...

Reborn Lee 2969

树形结构无限极分类数据结构以及递归函数写法

概述 很多人见过菜单导航之类的东西吧,还有分类什么的。就是一级数据下面有二级三级甚至更多,这种数据就需要用到这个树形结构了。 代码实现 废话不多说。先创建菜单的实体类吧 我是直接用的实体类里面的 main方法 写了个静态代码块用来模拟数据的。 数据库建模和这个差不多就行。 下面上方法 public class NavTree { // 创建一个静态的集合用来模拟从数据库中取出的数据 ...

qq_40990836的博客 878

判断两个多边形是否相交(java实现)

判断两个多边形是否相交 ,当前认为一个点相交也是相交,可针对凹多边形和凸边型等多复杂的多边形进行相交判断,采用java实现,因为网上java实现的比较少,所以这里写下如何实现,适用于碰撞检测,地图等等应用场景

IT_CREATE的博客 5845

Java设计模式之责任链模式、职责链模式

继续介绍23种设计模式系列,本文介绍的是职责链模式。

一个本科小生的奋斗史 4万+

六轴机器人正解

采用的是John H.Craig在【机器人学导论】中的改进DH模型 1.六轴坐标系 2.DH参数 i αi−1\alpha_{i-1}αi−1​ ai−1a_{i-1}ai−1​ did_idi​ θi\theta_iθi​初值 1 0 0 0 0 2 -90 a1a_1a1​ 0 -90 3 0 a2a_2a2​ 0 -90 4 -90 a3a_3a3​ d4d...

m0_37581770的博客 2511

【Claude】Not logged in · Please run /login 报错已解决

意味着 Claude Code 没有找到任何有效凭证。直接/login——交互式首选;检查——排查环境变量污染;CI 用——自动化场景标准方案;macOS Keychain 异常——/logout/login重置;时钟偏差——校准系统时间。参考:Claude Code 官方《错误参考》"身份验证"章节、官方认证优先级文档、社区 Token 过期排查记录。

博客 9981

23种设计模式(22)_行为型_责任链模式(Chain of Responsibility Pattern)

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。责任链模式与if…else…相比,他的耦合性要低一些,因为它把条件判定都分散到了各个处理类中,并且这些处理类的优先处理顺序可以随意设定。责任链模式也有缺点,这与if…else…语句的缺点是一样的,那就是在找到正确的处理类之前,所有的判定条件都要被执行一遍,当责任链比较长时,性能问题比较严重。

heyuchang666的专栏 608

uniapp(安卓苹果app端) - 微信小程序分享提示报错“由于不支持的分享类型无法分享到微信“,“由于应用和小程序未绑定在同意微信开放平台账号,无法分享到微信“解决办法,uniapp小程序分享失败

uni-app,安卓app,苹果app,手机app端,苹果ios,安卓Android,移动端app,分享,微信分享,微信朋友圈,微信好友,转发,vue2,vue3,App端调用手机的系统分享,微信小程序,分享功能,原生app分享小程序到微信,可分享到微信、朋友圈等,报错,uniapp分享报错由于不支持的分享类型无法分享到微信,未审核应用,uniApp安卓苹果app报错由于应用和小程序未绑定在同意微信开放平台账号,无法分享到微信,微信appid,已经配置了,还是报错,无法解决,一直提示,APP_ID错误,打包

✅ 精选推荐文章 5510

"围观"设计模式(22)--行为型之职责链模式(Chain Of Responsibility Pattern)

责任链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。----WIKIPEDIA 个人的理解 责任链模式用到了链表的数据结构,存在一定的次序性,A->B->C这样的一条链表,在责任链模式中,请求

王洋的专栏 6680

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

设计模式学习之责任链模式(Chain of Responsibility,行为型模式)(22)

参考:http://www.cnblogs.com/zhili/p/ChainOfResponsibity.html 一、引言   在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所以在面试的完后,经常会有面试官说,你这个薪水我这边觉得你这技术可...

weixin_30636089的博客 67

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【python设计模式】22、责任链模式

在责任链模式中,每个处理器(Handler)都可以处理一个请求,如果它不能处理这个请求,就把请求传递给下一个处理器,直到有一个处理器能够处理为止。每个对象都有处理请求的机会,如果它不能处理请求,就会将请求传递给下一个对象。因此,当一个请求到达 ConcreteHandler1 时,它会首先尝试由 ConcreteHandler1 来处理,如果不能处理,则会传递给 ConcreteHandler2,然后是 ConcreteHandler3,最后是 DefaultHandler。处理器链继续处理请求。

Htojk的博客 873

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

.net设计模式-责任链模式

行为型设计模式:关注对象与行为的分离 责任链模式:解决一个请求需要多个环节处理,环节还可能扩展 、变化、调整顺序等问题 下面是模拟一个审批的流程,context 是记录这一流程的上下文环境,如果按照最基本的写法为 1 //一个请假申请 2 ApplyContext context = new ApplyContext() 3 ...

aifan2109的博客 356

PHP设计模式之责任链模式

PHP设计模式之责任链模式 责任链模式,属于对象行为型的设计模式。 Gof类图及解释 GoF定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 GoF类图 代码实现 abstract class Handler { protected $successor; pub...

bujidexinq的专栏 219

php责任链模式的订单,PHP设计模式之责任链模式

责任链模式,属于对象行为型的设计模式。Gof类图及解释GoF定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。GoF类图代码实现abstractclassHandler{protected$successor;publicfunctionsetSuccessor($successor){$...

weixin_32758601的博客 182

详解设计模式 责任链模式

责任链模式 责任链模式属于行为型模式 定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止 每个对象持有对下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求. 模式类图 角色 抽象处理接口:Handler 具体处理类:Con...

qq_35783095的博客 287

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

本文将结合个性化推荐系统中的广告推荐流程来讲解责任链模式,广告位经过定义的责任链 预处理—>召回模块—>粗排序模块—>精排序模块—>规则模块—> 资讯模块—>后处理:上报信息 得到个性化的推荐广告位,来讲解责任链模式在实际生产中的使用方式。 一、配置信息 jdk 版本:jdk8 框架:springboot 二、maven配置 <dependenc...

两只橙的博客 2806

第22章 责任链模式

第22章 责任链模式 1 前言 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。 2 介绍 2.1 意图 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求

weixin_44040023的博客 131

设计模式-责任链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.

java领域分享 4061

设计模式——22. 责任链模式

责任链模式是一种行为设计模式,它允许你创建一个对象链,每个对象都包含了请求的一部分处理逻辑,并且请求按照链的顺序依次传递,直到有一个对象处理它为止。责任链模式通常用于将一个请求从发送者传递给多个接收者,直到有一个接收者处理请求为止。

472
上一篇: 【第一章】—-(1)认识C++对象
下一篇: 【Python】学习笔记——-7、Python代码运行助手
白衣染霜陈
博客等级 码龄22年 682粉丝 338原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值