责任链模式

设计模式之责任链模式(Chain of Responsibility)详解及代码示例

浪尽此生 提交于 2020-04-01 05:47:13
一、责任链模式的定义与特点   责任链(Chain of Responsibility)模式的定义:责任链模式也叫职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。   在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。 二、责任链模式优缺点   责任链模式是一种对象行为型模式,其主要优点如下: 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。   其主要缺点如下: 不能保证每个请求一定被处理

设计模式——责任链模式

倖福魔咒の 提交于 2020-03-24 16:24:50
本系列博客是自己在学习设计模式过程中收集整理的文章集合,其他文章参看 设计模式传送门 本文是转载文章,原文请参考 此博客 概念 责任链模式 (Chain of Responsibility)中包含包含一些命令对象和处理对象。处理对象会通过指针形成链式结构(责任链),命名对象经过 责任链上的处理对象一个个处理得到最终的处理结果。 优缺点 在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。 优点 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。 缺点 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理

设计模式-责任链模式【二】

烈酒焚心 提交于 2020-03-20 22:56:10
3 月,跳不动了?>>> 什么是责任链模式? 客户端发出一个请求,链上的对象都有机会处理这个请求,客户端不需要知道谁是具体的处理对象。 好处: 发送者和接受之间结耦,并且客户端可以实现动态组合责任链,编程更加方便灵活。 应用场景 : 过滤器,api限流,权限控制,参数过滤,session过滤,表单过滤,请求头过滤等 项目结构和结果 这里我们以拦截关的形式,链表形式,开始上代码! 数据库表结构 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for gateway_handler -- ---------------------------- DROP TABLE IF EXISTS `gateway_handler`; CREATE TABLE `gateway_handler` ( `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `handler_name` varchar(32) DEFAULT NULL COMMENT 'handler名称', `handler_id` varchar(32) DEFAULT NULL COMMENT 'handler主键id',

架构师内功心法,必须完全掌握吃透的踢皮球方式的责任链模式详解

前提是你 提交于 2020-03-16 17:50:55
某厂面试归来,发现自己落伍了!>>> 在日常生活中责任链模式还是挺常见的,我们平时工作处理一些事务,往往都是各个部门协同合作完成某一个项目任务。而每个部门都有自己的职责,所以很多时候事情完成了一部分,便会交给下一个部门,直到所有的部门全部完成所有的工作之后,那么这个项目任务才算最终完成。还有平时说的过五关斩六将其实也是一种责任链的模式。 一、责任链模式的应用场景 责任链模式(Chain of Responsibility Pattern)是将链中的每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护下一个节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给每一个节点对象,直到有对象处理这个请求为止。责任模式主要是解耦请求与处理,客户只要将请求发送到对应的链上即可,无需关心请求的具体内容和处理细节,请求会自动进行传递直至有节点的对象进行处理。 责任链模式适用于以下几个场景: 多个对象可以处理同一请求,但是具体由哪个对象处理则在运行时动态决定的; 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求; 可动态指定一组对象处理请求。 责任链模式主要包含两种角色: 抽象处理者(Handler):定义一个请求处理的方法,并维护下一个处理节点Handler对象的引用; 具体处理者(ConcreteHandler):对请求进行处理,如果不感兴趣,则进行转发。

JAVA设计模式之责任链模式

让人想犯罪 __ 提交于 2020-03-16 00:00:32
在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。 责任链模式涉及到的角色如下所示: 1 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。 2 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。 举一个简单的例子,部门办活动需要报销。报销处职员可以处理单次500元以下的业务,超过500需要和处长联系。而处长只能处理单次1000元一下的业务,再高就只能找老大报了。但是老大目前只能处理单次1500元以下的业务,再高目前只能拒绝报销了。 这个例子的具体实现为: 抽象类Handler public abstract class Handler { protected Handler nextHandler = null; public

设计模式之责任链模式

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

JAVA设计模式之责任链模式

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

第五章 责任链设计模式

自古美人都是妖i 提交于 2020-02-26 16:03:56
责任链设计模式 1、责任链设计模式有点类似于数据结构中的递归于回溯的两个过程 2、也可以使用面向对象编程对象嵌入对象的方式实现(链表 --> 的作用是建立类之间的关系,C语言使用指针建立地址之前的关系) 代码实现 /** * 需求: * 1、 满200减20 * 2、 首次购减20 * 3、 第二单打9折 * ............. */ public abstract class BaseChain { protected BaseChain baseChain ; public BaseChain ( BaseChain baseChain ) { this . baseChain = baseChain ; } // 计算方法 public int calculate ( int total ) { if ( this . baseChain != null ) { return this . baseChain . calculate ( total ) ; } return total ; } } public class FullDiscount extends BaseChain { FullDiscount ( BaseChain fullDiscount ) { super ( fullDiscount ) ; } @Override public int

看懂了责任链模式,你就能明白很多

和自甴很熟 提交于 2020-02-26 14:28:41
前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star : https://github.com/ZhongFuCheng3y/3y 最近在看项目代码的时候发现「责任链模式」,于是想花点时间来写写什么是责任链模式。 不知道大家是怎么学习设计模式的,一般我都是用到的时候,或者接触到的时候才会去学。否则感觉学完就很容易就忘掉了,不能理解为什么要使用设计模式(因为没有真实的场景给我去使用)。 在之前我已经更新说几篇设计模式的文章了,我觉得写得「还行」,有兴趣的同学可以到我的 GitHub 上,关键字搜索「 设计模式 」,就能找到对应的文章。 不得不说,我现在负责项目的代码我常常会感叹: 这代码怎么这么骚啊! 项目里边用到了很多的设计模式,在最开始看的时候会很费劲(因为之前没学),但维护起来是真的方便。 一、什么是责任链模式? 在说责任链模式之前,我们先来聊聊「 过滤器 」。 过滤器相信大家都肯定学过了,在最开始学Servlet的时候我们会学到 Filter 。等学到Struts2的时候,我们会学到 Interceptor 。等学到SpringMVC的时候,我们会学到 HandlerInterceptor 。 但无论学哪个框架,我们发现是最终其实它还是做 Filter 这么一件事。说白了就是: 把所有的过滤器都放在 FilterChain 里边,依次执行每个过滤器。

责任链模式

牧云@^-^@ 提交于 2020-01-31 08:27:25
定义 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象处理。 场景举例 员工请假流程。 具体实现 请假申请基本信息类: /** * 封装请假的基本信息 */ public class LeaveRequest { // 员工名称 private String empName; // 请假天数 private int leaveDays; // 请假原因 private String reason; public LeaveRequest(String empName, int leaveDays, String reason) { this.empName = empName; this.leaveDays = leaveDays; this.reason = reason; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName; } public int getLeaveDays() { return leaveDays; } public void setLeaveDays(int leaveDays) {