责任链模式

设计模式之责任链模式

孤者浪人 提交于 2019-12-22 08:22:21
定义:责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。 责任链可能是一条’直线‘、一个‘环链’或者一个‘树’结构的一部分。 责任链模式涉及到的角色如下所示:   ●   抽象处理者(Handler)角色: 定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。   ●   具体处理者(ConcreteHandler)角色: 具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。 结构: 代码举例: 抽象处理者角色 public abstract class Handler { /** * 持有后继的责任对象 */ protected Handler successor; /** * 示意处理请求的方法,虽然这个示意方法是没有传入参数的 * 但实际是可以传入参数的

责任链模式

北慕城南 提交于 2019-12-21 04:35:36
介绍 意图: 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 主要解决: 职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。 何时使用: 在处理消息的时候以过滤很多道。 如何解决: 拦截的类都实现统一接口。 关键代码: Handler 里面聚合它自己,在 HanleRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。 应用实例: 1、红楼梦中的"击鼓传花"。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。 优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。 缺点: 1、不能保证请求一定被接收。 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 3、可能不容易观察运行时的特征,有碍于除错。 使用场景: 1

JAVA设计模式之责任链模式

只愿长相守 提交于 2019-12-19 05:39:23
责任链模式(Chain of Responsibility)的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 在处理用户的请求时可能要根据不同的情况对请求添加不同的处理逻辑,在这时候就可以利用责任链进行设计。当需要添加一个处理逻辑时可以很方便的添加一个处理的节点。 现在我们的需求是处理用户的请求,将用户提交的字符串信息进行层层处理,同时在处理完成之后返回结果时,也要对返回的字符串进行层层处理,而处理返回的情况时其处理的顺序和先前是正好相反的顺序。 首先建立用户的请求和接收对象Request和Response: [java] view plain copy 1. package com.lcq.filter; 2. 3. public class Request { 4. String requestStr; 5. 6. public String getRequestStr() { 7. return requestStr; 8. } 9. 10. public void setRequestStr(String requestStr) { 11. this.requestStr = requestStr; 12. } 13. 14. } [java] view plain

JAVA设计模式-责任链模式

心不动则不痛 提交于 2019-12-19 01:59:48
博客专家福利 C币兑换平台上线 10月推荐文章汇总 关于11月28日CSDN遭受网络攻击的情况说明 java设计模式——责任链 分类: java 设计模式-Java 2012-03-23 15:19 4045人阅读 评论 (4) 收藏 举报 设计模式 java filter string class struts 责任链模式(Chain of Responsibility)的目标是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 在处理用户的请求时可能要根据不同的情况对请求添加不同的处理逻辑,在这时候就可以利用责任链进行设计。当需要添加一个处理逻辑时可以很方便的添加一个处理的节点。 现在我们的需求是处理用户的请求,将用户提交的字符串信息进行层层处理,同时在处理完成之后返回结果时,也要对返回的字符串进行层层处理,而处理返回的情况时其处理的顺序和先前是正好相反的顺序。 首先建立用户的请求和接收对象Request和Response: [java] view plain copy print ? package com.lcq.filter; public class Request { String requestStr; public String getRequestStr() {

设计模式(三) 责任链模式

ぃ、小莉子 提交于 2019-12-17 18:21:06
定义 责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。 发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。 简而言之,就是将多个对象以链条的形式进行连接。每一个对象都会引用下一个对象。 请求在链条上进行传递,直到某个对象处理了请求,传递终止。 责任链类图 责任链模式涉及到的角色如下所示 ● 抽象处理者(BaseHandler)角色 : 定义出一个处理请求的接口。如果需要,接口可以定义出一个方法以设定和返回对下家的引用。 这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用, 抽象方法handleRequest()规范了子类处理请求的操作。 ● 具体处理者(ConcreteHandler)角色: 具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。 由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。 源代码 抽象处理者(Handler)角色 定义了一个对象,四个方法: successor:持有当前责任的对象。 getSuccessor():获取下家责任对象的方法。 setSuccessor()

设计模式--责任链模式

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-16 14:37:56
责任链模式: 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。 组成结构: 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。 类图: 代码实现: public abstract class Handler { public Handler successor; public abstract void handleRequest(); public void setSuccessor(Handler successor) { this.successor = successor; } } public class ConcreteHandlerA

责任链模式

被刻印的时光 ゝ 提交于 2019-12-13 20:28:17
在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了难度。这样的例子还有很多,如找领导出差报销、生活中的“击鼓传花”游戏等。 在计算机软硬件中也有相关例子,如总线网中数据报传送,每台计算机根据目标地址是否同自己的地址相同来决定是否接收;还有异常处理中,处理程序根据异常的类型决定自己是否处理该异常;还有 Struts2 的拦截器、 JSP 和 Servlet 的 Filter 等,所有这些,如果用责任链模式都能很好解决。 模式的定义与特点 责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。 注意:责任链模式也叫职责链模式。 在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。 责任链模式是一种对象行为型模式,其主要优点如下。 降低了对象之间的耦合度

java设计模式之责任链模式

对着背影说爱祢 提交于 2019-12-10 04:32:37
什么是责任链: 责任链是一种思想,类比现实生活中,在一种需要审批的业务中,用户提交了请求之后就不用管了,至于后续业务中具体是谁审批通过的,用户并不关心也无从得知,只要最终审批通过了就可以。 映射到责任链的这一种设计模式上,解释来说就是:某一个提交的请求对象,在得到最终的结果之前,中间可能要经过多个对象的处理,这些处理请求的对象前后之间存在前置和后继的关系,连接在一起就形成了一个处理链条,对于链条上的每个节点来说,只要能够处理请求,就可以得到请求的结果并返回,否则就把请求继续移交给后续的处理对象,直到最终获取到请求的结果 比如我们熟知的servlet中的filter组件中,就存在责任链模式,还有springsecurity中,大量的责任链模式的使用,下面通过两个简单的案例简要说说责任链模式的使用 案例分享一 需求:用户提交自己的身份证号后,就可以知道自己是否是北京、上海、广州、深圳的户口 1、公共处理者接口 public interface Handler { public abstract void handlerRequest ( String number ) ; public abstract void setNextHandler ( Handler handler ) ; } 公共的处理者部分如果没有特殊的公共业务,可以直接使用接口即可,否则一般使用抽象类 2

java23种设计模式之十:责任链模式

喜欢而已 提交于 2019-12-07 15:46:30
  最近在学习netty中发现其中用到了责任链模式,然后结合自己在写代码中遇到了大量写if...else的情况,决定学习一下责任链模式。 一.什么样的场景下会选择用责任链模式   我们在进行业务逻辑判断时,需要根据传入参数类型的不同做出不同的处理,如果在传入的参数类型相对较少的情况时,可以用if...else来做判断,这样的确是没有什么问题的,但是如果后期由于业务系统的扩展,导致参数类型会随之延伸出很多种不同的处理,这时就需要用责任链模式来抒代码重构,这样会让代码封装的更好、更简洁,阅读性更强,后期如果增加了新的处理场景,只需要增加新的类就行,不会对原代码有很大的改动。 责任链模式的使用,会让方法的调用像递归一样的调用向后传递,如果传入的参数类型符合第1个handler处理的定义,那么就由第1个handler进行处理,如果不能处理,那就交由后续的handler进行处理。 大量的写if...else是可以解决问题,但个人认为写多了,这样的if...else就像一面墙一样,在等着请求类型的不同来选择不同的方法进行处理,而责任链是一条线一样的处理模式,能处理就由当前的处理,不能处理则由后面的handler处理。 二.责任链模式的编写   1.抽象1个总的handler   2.编写3个实现类来实现handler   3.请求类   4.客户端测试类 /** * 处理机器人请求 * *

责任链模式(管理流程)

别来无恙 提交于 2019-12-06 10:10:17
责任链模式(Chain of Responsibility): 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一对像处理它为止。 一、UML结构图 二、代码示例 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace 责任链模式 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 Handle hA=new ConcreteHandleA(); 13 Handle hB = new ConcreteHandleB(); 14 Handle hC = new ConcreteHandleC(); 15 16 hA.SetNextHandle(hB); 17 hB.SetNextHandle(hC); 18 19 hA.HandleRequest(); 20 21 Console.Read(); 22 } 23 } 24 25 /// <summary> 26 /// 请求处理类 27 /// </summary> 28 public abstract class