责任链模式

java设计模式~责任链模式

巧了我就是萌 提交于 2019-12-03 14:04:10
责任链,我感觉对就根据需求动态的组织一些工作流程,比如完成一件事有5个步骤,而第1步,第2步,第3步它们的顺序可以在某些时候是不固定的,而这就符合责任链的范畴,我们根据需求去设计我们的这些链条,去自己指定它们的执行顺序,下面看我的一个例子。 出现的对象 抽象责任 具体责任 抽象链条 具体链条 对象的解释 抽象责任,也可以说是一个行为,它规定的这类行为的签名 具体责任,去实现抽象责任,它就是我们上面说的每个步骤的实现 抽象链条,它将会去初始化你的责任链条,提供外部调用链条的入口,但没有具体指定链条的顺序 具体链条,只负责指定这些链条的顺序 代码实现 抽像责任 public abstract class ChainHandler { private ChainHandler next; public abstract void execute(HandlerParameters parameters); public ChainHandler getNext() { return next; } public ChainHandler setNext(ChainHandler next) { this.next = next; return this.next; } /** * 链条的处理方法,单向链表的遍历。 * * @param handlerParameters */

责任链模式

杀马特。学长 韩版系。学妹 提交于 2019-12-03 13:26:00
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。 介绍 意图: 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 主要解决: 职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。 何时使用: 在处理消息的时候以过滤很多道。 如何解决: 拦截的类都实现统一接口。 关键代码: Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。 应用实例: 1、红楼梦中的"击鼓传花"。 2、JS 中的事件冒泡。 3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。 优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象

《JAVA与模式》之责任链模式

人走茶凉 提交于 2019-12-03 06:25:12
详细请访问原博客:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的:    责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。 从击鼓传花谈起   击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。   比如说,贾母、贾赦、贾政、贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链。击鼓者将花传给贾母,开始传花游戏。花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又贾宝玉传给贾环,由贾环传回给贾母,如此往复,如下图所示。当鼓声停止时,手中有花的人就得执行酒令。   击鼓传花便是责任链模式的应用。责任链可能是一条直线、一个环链或者一个树结构的一部分。 责任链模式的结构  

设计模式:责任链模式

匿名 (未验证) 提交于 2019-12-03 00:34:01
责任链模式(ChainOfResponsibilityPattern)属于 行为型模式的一种,将请求沿着一条链传递,直到该链上的某个对象处理它为止。 概述 定义如下:一个请求有多个对象来处理,这些对象形成一条链,根据条件确定具体由谁来处理,如果当前对象不能处理则传递给该链中的下一个对象,直到有对象处理它为止。 责任链模式通过将请求和处理分离开来,以进行解耦。职责链模式结构的核心在于引入了一个抽象处理者。 UML结构图 案例 1.定义 AbstractHandler(抽象处理者),使子类形成一条链 public abstract class AbstractHandler { private AbstractHandler handler ; public AbstractHandler getHandler() { return handler; } public void setHandler(AbstractHandler handler) { this.handler = handler; } public abstract void handleRequest(String condition); } 2.创建若干个 ConcreteHandler(具体处理者)继承 AbstractHandler,在当前 处理者对象无法处理时,将执行权传给下一个 处理者对象 public

行为型(三)― 责任链模式

匿名 (未验证) 提交于 2019-12-03 00:30:01
1、介绍 多个节点首尾相连多构成的模型称为链。将这种结构应用到编程领域,将每个节点看作是一个对象,将一个请求对链式的首端发出,沿着链的路径传递给每一个节点对象,直到有对象处理了该请求为止,这种模式称为责任链模式。 2、定义 使得对个对象有机会处理请求,从而避免了请求的发送者和接收者之间的耦合性关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。 3、使用场景 一个请求需要一系列的处理工作 业务流的处理,例如:文件审批 多个对象可以处理同一请求,但需运行时动态决定哪个对象处理该请求 4、UML类图 角色说明: Handler:抽象处理者对象,声明了处理处理请求的方法,并保持 下一个处理者的引用 ConcreteHandler:具体的处理者对象,处理请求,不能处理则传递给下一一下处理者进行处理 5、示例 小明出差深圳一个月回来需要报销费用5万,小明的直接向组长申请报销费用,由于组长的权限是1000,所以组长拿着报销单得向主管申请,但是主管的权限是5000,于是主管又去找经理,但是经理的最高审批额度是1w,经理又去找大boss进行审批,小明只需将报销单给组长,无需关心谁最终审批,责任链模式很好地将请求者和处理者进行解耦。具体代码如下: /** * 抽象处理者 */ public abstract class Leader { protected Leader

责任链模式和观察者模式

匿名 (未验证) 提交于 2019-12-03 00:22:01
责任链模式 避免请求发送者与接收者耦合在一起,让多个对象都有可能接受请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 通过下面例子,当办公室失火,会通知仓库的保安,保安会通知整个大楼。 抽象区域: public abstract class Zone{ private Zone parentName; private String localName; public Zone(String name) { localName = name; } public void setParentName(Zone parentName) { this.parentName = parentName; } public void notifyPare() { if(parentName != null) { parentName.notifyPare(); return; } dosomething(); } abstract void dosomething(); } 具体实现类: /** * 办公室 * @author jiahua * */ public class Office extends Zone { public Office(String name) { super(name); } @Override void dosomething() {

通俗易懂设计模式解析

橙三吉。 提交于 2019-12-02 10:24:33
前言   今天我们介绍的是责任链模式【Chain of Responsibility Pattern】。对于责任链模式理解起来还是比较容易的。例如在公司请假、三天以内部门经理批准即可,但是三到七天可能就需要总监批准了、七天以上需要副总裁批准。对于这么一个需求最初的解决方案就是if-else语句判断。但是 一旦请假的模式增加一种则需要对多重if-else进行修改,这就违背了开闭原则。这个时候就可以采用责任链模式来解决其问题。责任链模式为请求创建一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。 回到顶部 责任链模式介绍 一、 来由   在软件系统中,经常会有一个请求可能会被多个对象处理。但是每一次都是被一个对象处理。又不能确定是哪一个对象。如果显示指定每一个对象。会对请求发送者和接收者造成紧耦合。那么如何做到对请求的发送者和接收者进行解耦。并且在运行时自行决定处理请求的对象呢? 二、 意图   避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 三、 案例 四、 责任链模式代码示例 看上述案例图,主要涉及到两个部分:    抽象处理者:定义一个处理请求的接口    具体处理者:实现处理请求的接口、可以选择是自己处理或者传递给下一个接收者。包含对下一个接收处理者的引用。

责任链设计模式

六月ゝ 毕业季﹏ 提交于 2019-12-01 19:42:50
责任链模式的定义与特点 责任链模式的定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止 。 标准的责任链模式,个人总结下来有如下几个特点: 链上的每个对象都有机会处理请求 链上的每个对象都持有下一个要处理对象的引用 链上的某个对象无法处理当前请求,那么它会把相同的请求传给下一个对象 用一张图表示以下使用了责任链模式之后的架构: 也就是说, 责任链模式满足了请求发送者与请求处理者之间的松耦合,抽象非核心的部分,以链式调用的方式对请求对象进行处理 。 这么说不明白?那么下面通过实际例子让你明白。 不使用责任链模式 http://www.wityx.com/post/240_1_1.html 为什么要使用责任链模式,那么我们得知道不使用责任链模式有什么坏处,然后通过使用责任链模式如何将代码优化。 现在有一个场景:小明要去上学,妈妈给小明列了一些上学前需要做的清单(洗头、吃早饭、洗脸),小明必须按照妈妈的要求,把清单上打钩的事情做完了才可以上学。 首先我们定义一个准备列表PreparationList: 1 public class PreparationList { 2 3 /** 4 * 是否洗脸 5 */ 6 private boolean washFace; 7 8 /** 9 *

通俗易懂设计模式解析——责任链模式

心已入冬 提交于 2019-12-01 15:12:06
前言   今天我们介绍的是责任链模式【Chain of Responsibility Pattern】。对于责任链模式理解起来还是比较容易的。例如在公司请假、三天以内部门经理批准即可,但是三到七天可能就需要总监批准了、七天以上需要副总裁批准。对于这么一个需求最初的解决方案就是if-else语句判断。但是 一旦请假的模式增加一种则需要对多重if-else进行修改,这就违背了开闭原则。这个时候就可以采用责任链模式来解决其问题。责任链模式为请求创建一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。 责任链模式介绍 一、 来由   在软件系统中,经常会有一个请求可能会被多个对象处理。但是每一次都是被一个对象处理。又不能确定是哪一个对象。如果显示指定每一个对象。会对请求发送者和接收者造成紧耦合。那么如何做到对请求的发送者和接收者进行解耦。并且在运行时自行决定处理请求的对象呢? 二、 意图   避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 三、 案例 四、 责任链模式代码示例 看上述案例图,主要涉及到两个部分:    抽象处理者:定义一个处理请求的接口    具体处理者:实现处理请求的接口、可以选择是自己处理或者传递给下一个接收者。包含对下一个接收处理者的引用。

责任链模式和观察者模式实现一个简易的架构(一)

自作多情 提交于 2019-12-01 07:20:25
场景描述:   以金融行业的贷款业务为例,客户提交贷款申请,即进件。系统针对进件需要做一系列处理:保存申请信息、保存客户信息、对客户评分、触发风控检查、埋点、消推等。 传统编码方式:    竖向编程方式,就是按照逻辑一步一步执行。这样做的缺点,就是代码耦合度太高。 使用责任链模式和观察者模式解耦:   责任链模式:以单向链表为结构,一步一步执行,每一个businessHandlerContext(对应一个businessHandler)为一个执行单元,代码解耦。所有的操作属于一个事务。   观察者模式:针对需要异步处理的操作,与主流程无关,如埋点、消推等,使用线程池方式异步执行Listener。 架构设计如下: 1、从Head开始执行,一直到Tail结束 2、每一个执行单元对应一个自定义的businessHandler,执行完,需向下传递 3、在Tail中以线程池的方式异步执行Listener 总结:将设计模式应用到架构设计中,让我们的系统更加优雅、可靠、稳定、维护性高。 来源: https://www.cnblogs.com/dushenzi/p/11668023.html