【Java设计模式】责任链模式
✍ 责任链模式是我们介绍的第一个行为型模式,这里有必要把行为型模式好好介绍一下:
行为型模式(Behavioral Pattern) 是对 在不同的对象之间划分责任和算法的抽象化 。行为型模式不仅仅关注类和对象的结构,而
且 重点关注它们之间的相互作用 。通过行为型模式,可以更加清晰地 划分类与对象的职责 ,并 研究系统在运行时实例对象之间的交互 。在系统运行时,对象并不是孤立的,它们可以通过相互通信与协作完成某些复杂功能,一个对象在运行时也将影响到其他对象的运行。
行为型模式分为 类行为型模式
和 对象行为型模式
两种:
- 类行为型模式:类的行为型模式使用继承关系在几个类之间分配行为,类行为型模式主要通过多态等方式来分配父类与子类的职责。
- 对象行为型模式:对象的行为型模式则使用对象的聚合关联关系来分配行为,对象行为型模式主要是通过对象关联等方式来分配两个或多个类的职责。根据“合成复用原则”,系统中要尽量使用关联关系来取代继承关系,因此大部分行为型设计模式都属于对象行为型设计模式。
✍ 模式动机
职责链可以是 一条直线
、 一个环或者一个树形结构
, 最常见的职责链是 直线型
, 即沿着 一条单向的链
来传递请求 。 链上的每一个对象都是请求处理者 , 职责链模式可以 将请求的处理者组织成一条链 , 并使请求沿着链传递 , 由链上的处理者对请求进行相应的处理 , 客户端无须关心请求的处理细节以及请求的传递 , 只需将请求发送到链上即可 , 将请求的发送者和请求的处理者解耦 。 这就是职责链模式的模式动机 。
职责链模式(Chain of Responsibility Pattern) 的定义如下:避免请求发送者与接收者耦合在一起, 让多个对象都有可能接收请求 , 将这些对象连接成一条链 ,并且 沿着这条链传递请求 ,直到有对象处理它为止。由于英文翻译的不同,职责链模式又称为责任链模式。
职责链模式包含如下角色:
- Handler: 抽象处理者 :定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
- ConcreteHandler: 具体处理者:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
- Client: 客户类:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
✍ 演示一下:
课程类
public class Course {private String name;private String article;private String video;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getArticle() {return article;}public void setArticle(String article) {this.article = article;}public String getVideo() {return video;}public void setVideo(String video) {this.video = video;}@Overridepublic String toString() {return "Course{" +"name='" + name + '\'' +", article='" + article + '\'' +", video='" + video + '\'' +'}';}
}
责任者的抽象类 (Handler: 抽象处理者)
public abstract class Approver {protected Approver approver;public void setNextApprover(Approver approver){this.approver = approver;}public abstract void deploy(Course course);
}
审核笔记的责任者(笔记审核员) (ConcreteHandler: 具体处理者)
需要导入jar包 下载地址
import org.apache.commons.lang3.StringUtils;public class ArticleApprover extends Approver {@Overridepublic void deploy(Course course) {if(StringUtils.isNotEmpty(course.getArticle())){System.out.println(course.getName()+"含有配套文档,批准");if(approver != null){approver.deploy(course);}}else{System.out.println(course.getName()+"不含有配套文档,不批准,流程结束");return;}}
}
审核视频的责任者(视频审核员) (ConcreteHandler: 具体处理者)
import org.apache.commons.lang3.StringUtils;public class VideoApprover extends Approver{@Overridepublic void deploy(Course course) {if(StringUtils.isNotEmpty(course.getVideo())){System.out.println(course.getName()+"含有视频,批准");if(approver != null){approver.deploy(course);}}else{System.out.println(course.getName()+"不含有视频,不批准,流程结束");return;}}
}
类图:
审核视频的 和 审核笔记的 很明显是一条责任链
测试类(Client: 客户类)
public class Test {public static void main(String[] args) {Approver articleApprover = new ArticleApprover(); //笔记审核员Approver videoApprover = new VideoApprover(); //视频审核员Course course = new Course();course.setName("Java设计模式");course.setArticle("Java设计模式的配套笔记");course.setVideo("Java设计模式的视频");articleApprover.setNextApprover(videoApprover); //审核视频articleApprover.deploy(course); //审核视频}
}
结果:
这个设计模式还是比较简单的
✍ 模式分析
在职责链模式里 , 很多对象
由每一个对象对其下家的引用而连接起来形成一条链 。请求在这条链上传递 , 直到链上的某一个对象处理此请求为止 。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求 , 这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任
✍ 说一下它的优缺点
职责链模式的优点
- 降低耦合度
- 可简化对象的相互连接
- 增强给对象指派职责的灵活性
- 增加新的请求处理类很方便
职责链模式的缺点
- 不能保证请求一定被接收。
- 系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。
✍ 模式适用环境
在以下情况下可以使用职责链模式:
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可动态指定一组对象处理请求。
✍模式扩展
纯与不纯的职责链模式
- 一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个:一个是承担责任,另一个是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又将责任向下传的情况。
- 在一个纯的职责链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的职责链模式里面,一个请求可以最终不被任何接收端对象所接收。
【Java设计模式】责任链模式相关推荐
- Java设计模式-责任链模式
Java设计模式-责任链模式,我想这是值得你了解一下下的啦. 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持 ...
- Java 设计模式-责任链模式
1.定义 责任链模式是一种行为设计模式,允许你将请求沿着处理链发送,然后处理者都可对其进行处理,完成后可以再将其传递给下一个处理者. 可以控制请求的处理的顺序 单一职责原则,可以对发起操作和执行操作的 ...
- Java设计模式—责任链模式
责任链模式的定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 责任链模式的重点是在"链& ...
- java实现责任链模式_我的Java设计模式-责任链模式
今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...
- Java设计模式——责任链模式(职责链模式)详解
模式的定义与特点 责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链:当 ...
- java设计模式---责任链模式详解
深入理解什么是责任链模式 一,责任链模式 1,什么是责任链模式 二,框架中使用到的责任链模式 1,springmvc流程 2,mybatis的执行流程 3,spring的过滤器和拦截器 4,senti ...
- java责任链模式审批请假_Java设计模式-责任链模式
Java设计模式-责任链模式 Java版本:jdk1.8 IDE:IDEA 一 前言 本文介绍责任链模式以及Java下的实现. 二 概念 1.什么是责任链模式 责任链模式(Chain of Respo ...
- 设计模式--责任链模式--Java实现
设计模式–责任链模式–Java实现 责任链模式–链式数据结构–内存消耗–Java的awt事件一开始用责任链模式后来改为观察者模式–为什么呢?–现在的应用–dom事件–异常处理机制-过滤器链–等等 学习 ...
- 理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式丨C++后端开发丨Linux服务器开发丨web服务器
理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式 1. 开闭.单一职责.里氏替换.接口隔离等设计原则 2. 随处可见的模板方法 3. nginx中核心设计模式 责任链模式 4. 责 ...
- java 事件链_Java设计模式——责任链模式(Chain of Responsibility)
责任链 责任链模式通俗来说就是关联一串能够处理事务的对象,使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. ...
最新文章
- bugku——web 做题记录
- cmd窗口设置charset
- 高手教你如何用香技巧香水达人教你用香省钱法 - 生活至上,美容至尚!
- C++ 基础 : 函数重载、引用、内联函数、auto、范围for循环
- Atitit.js this错误指向window的解决方案
- Hibernate知识问答
- SpringBoot 3.0最低版本要求的JDK 17,这几个新特性不能不知道!
- 两台主机经过路由器传送数据的网络原理
- Win32汇编——文件操作
- Bilateral Filters(双边滤波算法)原理及实现
- php开发问题-class_exists
- 傅里叶变换和自然对数e原来是这么回事
- 51单片机仿真——蜂鸣器
- Python数据分析与展示-图像的手绘效果
- 110 Ruby 版本管理器【Rails后端开发训练营】
- SFDC Developer
- 【MQTT】SpringBoot整合MQTT(EMQX)
- ubuntu 双显示屏设置 一个正常 一个不行的问题
- 购买网易企业邮箱后,怎么用手机移动端办公?
- 用Python 画小猪佩奇
热门文章
- tomcat部署web应用及架设论坛
- jar包 运行内存分配情况
- 活血化瘀药题库【1】
- Flutter iOS调用系统相机里面的文字显示英文
- DC离职率预测案例分析
- 程序人生 - 创可贴使用不当或致截肢
- linux网络驱动 poll,网络 – Linux网络驱动程序中的并发:probe()VS ndo_open(),ndo_start_xmit()VS NAPI poll()...
- 一个商人骑一头驴要穿越1000公里长的沙漠,去卖3000根胡萝卜。已知驴一次性可驮1000根胡萝卜,但每走一公里又要吃掉一根胡萝卜。问:商人共可卖出多少胡萝卜? 答:533
- Elasticsearch 分布式搜索引擎 -- 数据聚合(聚合的种类、DSL实现聚合、RestAPI实现聚合)
- Acunetix 网站漏洞扫描软件 检测您网站的安全性。