责任链模式

责任链模式

十年热恋 提交于 2020-01-26 09:44:06
责任链模式 在处理流程相关的业务的时候我们会经常碰到责任链模式的使用,所以对于这种设计模式我们还是应该有所了解的,所以本文就来记录下。 定义 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象处理。 场景: 1. 公司里面,报销个单据需要经过流程: • 申请人填单申请,申请给经理 • 小于1000,经理审查。 • 超过1000,交给总经理审批。 • 总经理审批通过 2.公司里面,请假条的审批过程: • 如果请假天数小于3天,主任审批 • 如果请假天数大于等于3天,小于10天,经理审批 • 如果大于等于10天,小于30天,总经理审批 • 如果大于等于30天,提示拒绝 具体实现代码 LeaveRequest   封装请假的相关信息 /** * 封装请假的基本信息 * @author 波波烤鸭 * */ public class LeaveRequest { // 员工名称 private String empName; // 请假天数 private int leaveDays; // 请假原因 private String reason; public LeaveRequest(String empName, int leaveDays, String reason) { super()

策略模式的孪生兄弟——对状态模式的深度复习总结

五迷三道 提交于 2020-01-20 08:58:49
前言 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂逻辑判断的,那么他们有什么不同呢? 回忆状态模式—— 策略模式的孪生兄弟——对状态模式的深度复习总结 :状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象表现得就好像修改了它的类一样。 状态模式的关键是各个状态子类必须知道下一个状态是什么 , 且要把逻辑判断转移到各个状态子类中,客户端不需要了解状态迁移的顺序。 状态模式虽然类图和策略模式几乎一样,但是策略模式的目的是针对单一算法,在运行时能替换,客户端需要事先了解策略,主动去选择合适的策略,不存在状态的自动迁移。 下面总结复习职责链模式。 责任链(职责链,Chain of Responsibility(CoR))概述 责任链,Chain of Responsibility(CoR),也叫职责链模式或者职责连锁模式,同状态模式一样,也是对象的行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,对象由每一个对象对其下家的引用而连接起来形成一条链,客户端发出的请求在这个链上传递,直到链上的某一个对象决定能处理此请求。 注意:发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任,所以该模式被称作职责链模式。 责任链模式的特点

责任链模式

ⅰ亾dé卋堺 提交于 2020-01-20 03:17:37
引言 初看责任链模式,心里不禁想起了一个以前听过的相声:看牙。说一个病人看牙的时候, 医生不小心把拔下的一个牙掉进了病人嗓子里。各个科室的医生推卸责任,搞得病人因此楼 上楼下的跑了不少冤枉路,最后无果而终。 责任链模式就是这种 “ 推卸 ” 责任的模式,你的问题在我这里能解决我就解决,不行就把 你推给另一个对象。至于到底谁解决了这个问题了呢?我管呢! 二、 定义与结构 从名字上大概也能猜出这个模式的大概模样 —— 系统中将会存在多个有类似处理能力 的对象。当一个请求触发后,请求将在这些对象组成的链条中传递,直到找到最合适的 “ 责 任 ” 对象,并进行处理。 《 Reading Glasses with Case 》中给它的定义如下:使多个对象都有机会处理请求,从而避免请求的发送 者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一 个对象处理它为止。 呵呵,从定义上可以看出,责任链模式的提出是为了 “ 解耦 ” ,以应变系统需求的变更和 不明确性。 下面是《设计模式》中给出的适用范围: 1) 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。 2) 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 3) 可处理一个请求的对象集合应被动态指定。 责任链模式真的能给发送者和接收者之间解耦(这好像很神奇)吗?先来看下它的组成

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

做~自己de王妃 提交于 2020-01-19 21:40:56
在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的:    责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。 从击鼓传花谈起   击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。   比如说,贾母、贾赦、贾政、贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链。击鼓者将花传给贾母,开始传花游戏。花由贾母传给贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又贾宝玉传给贾环,由贾环传回给贾母,如此往复,如下图所示。当鼓声停止时,手中有花的人就得执行酒令。   击鼓传花便是责任链模式的应用。责任链可能是一条直线、一个环链或者一个树结构的一部分。 责任链模式的结构   下面使用了一个责任链模式的最简单的实现。   责任链模式涉及到的角色如下所示:   ●   抽象处理者(Handler)角色: 定义出一个处理请求的接口。如果需要,接口可以定义

责任链模式-Chain of Responsibility Pattern

纵饮孤独 提交于 2020-01-19 19:18:59
责任链模式(Chain of Responsiblity Pattern) 为这种请求创建了一个接受者的链。这种模式给予请求的类型 这种模式给予请求的类型 对请求的发送者和接受者进行解偶。 这种类型的设计模式属于行为模式。 在这种模式中,通常每个接受者都包含对另一个接受者的引用 如果一个对象不能处理该请求 那么它会把相同的请求传递给下一个请求。 意图:避免请求发送者与接受者耦合在一起,让多个对象有可能接受请求将这些连成一条链,并且沿着这条链传递请求,直到有对象处理为值。 下面是demo. package com.royan.weakey.platform.pattern.chainResponsibility; import lombok.Data; import lombok.extern.slf4j.Slf4j; /** * 责任链模式(Chain of Responsibility Pattern) * 为请求创建了一个接受者对象的链。这种模式给予请求的类型 * 这种模式给予请求的类型 对请求的发送者和接受者进行解偶。 * 这种类型的设计模式属于行为模式 * <p> * 在这种模式中,通常每个接受者都包含对另一个接受者的引用 * 如果一个对象不能处理该请求 那么它会把相同的请求下一个接收者 * <p> * 意图:避免请求发送者与接受者耦合在一起,让多个对象有可能接受请求 *

责任链模式(Chain of Responsibility)

自古美人都是妖i 提交于 2020-01-19 19:07:59
一、引言 初看责任链模式,心里不禁想起了一个以前听过的相声:看牙。有壹个牙科医生,第壹次给病人拔牙,非常紧张。他刚把臼齿拔下来,不料手壹抖,没有夹住,于是,牙齿掉进了病人的喉咙。“非常抱歉,”医生说,“你的病已不在我的职责范围之内,你应该去找喉科医生。”当这个病人找到喉科医生时,他的牙齿掉得更深了。喉科医生给病人做了检查。“非常抱歉,”医生说,“你的病已不在我的职责范围之内了,你应该去找胃病专家。”胃病专家用调光为病人检查后说:“非常抱歉,牙齿已掉到你的肠子里了,你应该去找肠病专家。”肠病专家同样做了调光检查后说:“非常抱歉,牙齿不在肠子里,它肯定掉到更深的地方了,你应该去找肛门科专家。”最后,病人趴在肛门科医生的检查台上,摆出壹个屁股朝天的姿势,医生用内窥镜检查了壹番,然后吃惊地叫道:“啊,天哪!你的这里长了颗牙齿,应该去找牙科医生。”。病人因此楼上楼下的跑了好多科室,最后无果而终。 责任链模式就是这种“推卸”责任的模式,你的问题在我这里能解决我就解决,不行就把你推给另一个对象。至于到底谁解决了这个问题了呢?我管呢! 二、定义与结构 从名字上大概也能猜出这个模式的大概模样——系统中将会存在多个有类似处理能力的对象。当一个请求触发后,请求将在这些对象组成的链条中传递,直到找到最合适的“责任”对象,并进行处理。 《设计模式》中给它的定义如下:使多个对象都有机会处理请求

责任链模式

坚强是说给别人听的谎言 提交于 2020-01-17 00:35:31
个人博客 http://www.milovetingting.cn 责任链模式 模式介绍 责任链模式是行为型设计模式之一。 模式定义 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者间的耦合。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。 使用场景 多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。 在请求处理者不明确的情况下向多个对象的一个提交请求。 需要动态指定 组对象处理请求。 简单使用 定义抽象请求类 public abstract class AbstractRequest { /** * 处理对象 */ private Object obj; public AbstractRequest(Object obj) { this.obj = obj; } /** * 获取处理对象 * @return */ public Object getContent() { return obj; } /** * 获取请求级别 * @return */ public abstract int getRequestLevel(); } 定义抽象处理类 public abstract class AbstractHandler { /** * 下一个处理者 */ AbstractHandler nextHandler; /** *

详解设计模式 责任链模式

微笑、不失礼 提交于 2020-01-15 06:50:42
责任链模式 责任链模式属于行为型模式 定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止 每个对象持有对下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求. 模式类图 角色 抽象处理接口:Handler 具体处理类:ConcreteHandler 优点 将请求与处理分开,请求者可以不用知道到底是需要谁来处理的,两者解耦,提高系统灵活性,增加新的请求处理类很方便 缺点 当调用链比较长的时候,调试不方便,写代码时要注意避免循环调用 模式代码实现 源码地址:https://github.com/mingyuHub/design-patterns 以用户注册为例,注册方式分为普通用户注册和Vip用户注册,使用责任链模式将两种注册方式链起来 抽象处理接口 抽象接口定义了两个方法:用户注册方法,责任链调用方法 /** * @author: chenmingyu * @date: 2019/3/22 20:32 * @description: */ public interface Handler { /** * 注册操作 * @param userName 用户名 */ String operator ( String

设计模式——责任链模式

岁酱吖の 提交于 2020-01-06 13:36:20
定义 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。 模板 client: 有待处理的请求(Request) Handler: 处理请求的抽象类/接口 Concretehandler 具体的请求处理类,这里只画了一个,其实有多个,他们共同组成一个链条。 实例 下面举一个讲解责任链模式中使用较多的例子。 AbstractLogger(相当于Handler) public abstract class AbstractLogger { public static int INFO = 1; public static int DEBUG = 2; public static int ERROR = 3; protected int level; //责任链中的下一个元素 protected AbstractLogger nextLogger; public void setNextLogger(AbstractLogger nextLogger){ this.nextLogger =

设计模式——责任链模式

烈酒焚心 提交于 2020-01-04 11:18:24
定义 顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。 模板 client: 有待处理的请求(Request) Handler: 处理请求的抽象类/接口 Concretehandler 具体的请求处理类,这里只画了一个,其实有多个,他们共同组成一个链条。 实例 下面举一个讲解责任链模式中使用较多的例子。 AbstractLogger(相当于Handler) public abstract class AbstractLogger { public static int INFO = 1; public static int DEBUG = 2; public static int ERROR = 3; protected int level; //责任链中的下一个元素 protected AbstractLogger nextLogger; public void setNextLogger(AbstractLogger nextLogger){ this.nextLogger =