设计模式-责任链模式Chain of Responsibility)
一、定义
职责链模式是一种对象的行为模式。在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
1、为请求创建一个接收此次请求对象的链
2、类型:行为型
二、适用场景
一个请求的处理需要多个对象当中的一个或几个协作处理
三、有点
请求的发送者和接收者(请求的处理)解耦
责任链可以动态的组合
四、缺点
责任链太长或者处理时间过长,影像性能
责任链有可能过多
五、类图:
职责链模式的组成:
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandle)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
六、实例:公司请病假,1天内,项目经理批准;2天内Senior PM批准; 大于两天,医院提供病例、假条
public abstract class LeaveBaseHandler
{
protected LeaveBaseHandler successor;
public LeaveBaseHandler getSuccessor()
{
return successor;
}
public void setSuccessor(final LeaveBaseHandler successor)
{
this.successor = successor;
}
public abstract void requestLeave(int days);
}
public class OneDayLeaveConcreteHandler extends LeaveBaseHandler
{
@Override
public void requestLeave(final int days)
{
if (days <= 1)
{
System.out.println("approve one day leave");
}
else
{
super.successor.requestLeave(days);
}
}
}
public class TwoDaysLeaveConcreteHandler extends LeaveBaseHandler
{
@Override
public void requestLeave(final int days)
{
if (days > 1 && days <= 2)
{
System.out.println("approve 2 days leave");
}
else
{
super.successor.requestLeave(days);
}
}
}
public class MoreThanTwoDaysConcreteHandler extends LeaveBaseHandler
{
@Override
public void requestLeave(final int days)
{
if (days > 2)
{
System.out.println("get the record for leave from hospital");
}
}
}
public class Client
{
private static void requestLeave()
{
final LeaveBaseHandler oneDay = new OneDayLeaveConcreteHandler();
final LeaveBaseHandler twoDays = new TwoDaysLeaveConcreteHandler();
final LeaveBaseHandler moreThanTwoDays = new MoreThanTwoDaysConcreteHandler();
oneDay.setSuccessor(twoDays);
twoDays.setSuccessor(moreThanTwoDays);
oneDay.requestLeave(1);
oneDay.requestLeave(2);
oneDay.requestLeave(3);
}
public static void main(final String[] args)
{
requestLeave();
}
}
结果:
approve one day leave
approve 2 days leave
get the record for leave from hospital
如果职责链结构比较复杂,会产生很多的内存垃圾对象。
七、实例2
课程审核
1、创建批准者类
/**
* 批准者 2019/1/7.
*/
public abstract class Approver { //责任链的核心是包含一个自己。 protected可以让子类获取到它
protected Approver approver; //设置下一个批准者
public void setNextApprover(Approver approver){
this.approver = approver;
} //发布课程
public abstract void deploy(Course course);
}
2、创建ArticleApprover
public class ArticleApprover extends Approver{
@Override
public void deploy(Course course) {
if(StringUtils.isNotBlank(course.getArticle())){
System.out.println(course.getName() + "含有Article,批准");
if(approver != null){
approver.deploy(course);
}
}else{
System.out.println(course.getName() + "无Article,不批准,流程结束");
return;
}
}
}
3、创建VideoApprover
public class VideoApprover extends Approver{
@Override
public void deploy(Course course) {
if(StringUtils.isNotBlank(course.getVideo())){
System.out.println(course.getName() + "含有Video,批准");
if(approver != null){
approver.deploy(course);
}
}else{
System.out.println(course.getName() + "无Video,不批准,流程结束");
return;
}
}
}
4、创建课程Course
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;
}
@Override
public String toString() {
return "Course{" +
"name='" + name + '\'' +
", article='" + article + '\'' +
", video='" + video + '\'' +
'}';
}
}
5、创建测试类
public class Test {
public static void main(String[] args) {
//审核员审核article
Approver articleApprover = new ArticleApprover();
//审核员审核video
Approver videoApprover = new VideoApprover();
Course course = new Course();
course.setName("设计模式");
course.setArticle("设计模式Article");
course.setVideo("设计模式Video");
articleApprover.setNextApprover(videoApprover);
articleApprover.deploy(course);
}
}
6、输出结果

八、在源码中的应用
1、javax.servlet.Filter
Servlet中的过滤器
设计模式-责任链模式Chain of Responsibility)的更多相关文章
- C#设计模式-责任链模式(Chain of Responsibility Pattern)
引子 一个事件需要经过多个对象处理是一个挺常见的场景,譬如采购审批流程,请假流程,软件开发中的异常处理流程,web请求处理流程等各种各样的流程,可以考虑使用责任链模式来实现.现在以请假流程为例,一般公 ...
- 23种设计模式--责任链模式-Chain of Responsibility Pattern
一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)
责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...
- 责任链模式-Chain of Responsibility(Java实现), 例2
责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...
- 责任链模式-Chain of Responsibility(Java实现), 例1
责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ...
- 《JAVA设计模式》之责任链模式(Chain of Responsibility)
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- 责任链模式/chain of responsibility/行为型模式
职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...
- 设计模式之二十:责任链模式(Chain of Responsibility)
感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有 ...
随机推荐
- day 29 socket 初级版
# 客户端介绍简单版# import socket# #1买手机# phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #SOCK_STR ...
- PCMU G.711U/PCMA G.711A简介
PCMA(G.711A) 类型:Audio 制定者:ITU-T 所需频宽:64Kbps(90.4) 特性:PCMU和PCMA都能提供较好的语音质量,但是它们占用的带宽较高,需要64kbps. 优点:语 ...
- python day02 作业答案
1. (1).false (2).false 2. (1).8 (2).4 3. (1).6 (2).3 (3).false (4).3 (5).true (6).true (7) ...
- 全局(Global) 与本地(Local)索引的区别
一.定义说明 oracle数据库中,存在多种对象,最常见的表和索引,索引的目的是为了加快查询:oracle建议一个表>2g时,就建议进行分区,分区表的好处此处省略,分区表有维护操作,但是某些维护 ...
- Refused to execute inline event handler because it violates the following Content Security Policy directive: "xxx". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...')
/********************************************************************************* * Refused to exec ...
- NOI-1.1-04输出保留3位小数的浮点数
04:输出保留3位小数的浮点数 总时间限制: 1000ms 内存限制: 65536kB 描述 读入一个单精度浮点数,保留3位小数输出这个浮点数. 输入 只有一行,一个单精度浮点数. 输出 也只有一 ...
- 20155208徐子涵 2016-2017-2 《Java程序设计》第6周学习总结
20155208徐子涵 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 10.1.1 1.Java将输入/输出抽象化为串流,数据有来源及目的地,衔接两者的是串 ...
- python开发day03
一.常见的数据类型 1. int ==> 整数. 主要⽤用来进⾏行行数学运算 \ (常见的操作有+-*%) a.bit_length() a= # 10进制 二进制 100 print(a.b ...
- HDU 1875:畅通工程再续(最小生成树)
畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HPU1460: 杨八方的表面兄弟
题目描述 如果你之前关注过HPUOJ的话,那么你一定听说过杨八方的名字.在去年,很多同学共同见证了杨八方同学的填报志愿.来到学校.军训--或许你曾陪同杨八方一起思考过许多问题,又或者你是刚听说这个名字 ...