背景:

学校规定参加校招的同学必须要请假,且要有相关人员的签字,三天以下需辅导员签字、三到七天需要系主任签字,一个星期以上需要院长签字,更多的则需要校长签字!

上图将学生、辅导员、系主任、院长、校长组成了一个简单的链,在这个链上,学生是申请者,其余的都是请求处理者。对于这种将请求一级一级地往上传递直到请求被处理的设计模式就是职责链模式。

一、什么是责任链模式:

职责链可以将请求的处理者组织成一条链,并将请求沿着链传递,如果某个处理者能够处理请求则处理,否则将该请求交由上级处理。客户端只需将请求发送到职责链上,无须关注请求的处理细节,通过职责链将请求的发送者和处理者解耦了,这也是职责链的设计动机。

职责链模式可以简化对象间的相互连接,因为客户端和处理者都没有对方明确的信息,同时处理者也不知道职责链中的结构,处理者只需保存一个指向后续者的引用,而不需要保存所有候选者的引用。

另外职责链模式增加了系统的灵活性,我们可以任意增加或更改处理者,甚至更改处理者的顺序,不过有可能会导致一个请求无论如何也得不到处理,因为它可能被放置在链末端。

所以责任链模式有以下几个优点:

  • (1)降低耦合度,将请求的发送者和接收者解耦。反映在代码上就是不需要在类中写很多丑陋的 if….else 语句,如果用了职责链,相当于我们面对一个黑箱,只需将请求递交给其中一个处理者,然后让黑箱内部去负责传递就可以了。
  • (2)简化了对象,使得对象不需要链的结构。
  • (3)增加系统的灵活性,通过改变链内的成员或者调动他们的次序,允许动态地新增或者删除处理者
  • (4)增加新的请求处理类很方便。

但是责任链模式也存在一些缺点:

  • (1)不能保证请求一定被成功处理
  • (2)系统性能将受到一定影响,并且可能会造成循环调用。
  • (3)可能不容易观察运行时的特征,而且在进行代码调试时不太方便,有碍于除错。

二、UML结构图:

  • (1)Handler:抽象处理者,定义了一个处理请求的方法。所有的处理者都必须实现该抽象类。
  • (2)ConcreteHandler:具体处理者,处理它所负责的请求,同时也可以访问它的后继者,如果它能够处理该请求则处理,否则将请求传递到它的后继者。
  • (3)Client: 客户类

下面是最典型的具体处理者类:

public class ConcreteHandler extends Handler
{public void handleRequest(String request){if(请求request满足条件){......  //处理请求;}else{this.successor.handleRequest(request); //转发请求}}
}

三、代码实现:

我们将使用开头那个请假的实例。请假:3天以下辅导员签字、3到5天系主任签字、6到10天院长签字、11-15天校长签字、15天以上不允签字。

首先是请假条:LeaveNode.java

public class LeaveNode {/** 请假天数 **/private  int number;/** 请假人 **/private String person;public LeaveNode(String person,int number){this.person = person;this.number = number;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public String getPerson() {return person;}public void setPerson(String person) {this.person = person;}
}

抽象处理者:Leader.java

public abstract class Leader {/** 姓名 **/public String name;/** 后继者 **/protected Leader successor;public Leader(String name){this.name = name;}public void setSuccessor(Leader successor) {this.successor = successor;}public abstract void handleRequest(LeaveNode LeaveNode);
}

四个具体处理者:辅导员:Instructor.java

public class Instructor extends Leader{public Instructor(String name){super(name);}public void handleRequest(LeaveNode LeaveNode) {if(LeaveNode.getNumber() <= 3){   //小于3天辅导员审批System.out.println("辅导员" + name + "审批" +LeaveNode.getPerson() + "同学的请假条,请假天数为" + LeaveNode.getNumber() + "天。");}else{     //否则传递给系主任if(this.successor != null){this.successor.handleRequest(LeaveNode);}}}}

系主任: DepartmentHead.java

public class DepartmentHead extends Leader{public DepartmentHead(String name) {super(name);}public void handleRequest(LeaveNode LeaveNode) {if(LeaveNode.getNumber() <= 7){   //小于7天系主任审批System.out.println("系主任" + name + "审批" +LeaveNode.getPerson() + "同学的请假条,请假天数为" + LeaveNode.getNumber() + "天。");}else{     //否则传递给院长if(this.successor != null){this.successor.handleRequest(LeaveNode);}}}
}

院长:Dean.java

public class Dean extends Leader{public Dean(String name) {super(name);}public void handleRequest(LeaveNode LeaveNode) {if(LeaveNode.getNumber() <= 10){   //小于10天院长审批System.out.println("院长" + name + "审批" +LeaveNode.getPerson() + "同学的请假条,请假天数为" + LeaveNode.getNumber() + "天。");}else{     //否则传递给校长if(this.successor != null){this.successor.handleRequest(LeaveNode);}}}}

校长:President.java

public class President extends Leader{public President(String name) {super(name);}public void handleRequest(LeaveNode LeaveNode) {if(LeaveNode.getNumber() <= 15){   //小于15天校长长审批System.out.println("校长" + name + "审批" +LeaveNode.getPerson() + "同学的请假条,请假天数为" + LeaveNode.getNumber() + "天。");}else{     //否则不允批准System.out.println("请假天天超过15天,不批准...");}}}

客户端:Client.java

public class Client {public static void main(String[] args) {Leader instructor = new Instructor("陈毅");       //辅导员Leader departmentHead = new DepartmentHead("王明");    //系主任Leader dean = new Dean("张强");      //院长Leader president = new President("王晗");     //校长instructor.setSuccessor(departmentHead);       //辅导员的后续者是系主任departmentHead.setSuccessor(dean);             //系主任的后续者是院长dean.setSuccessor(president);                  //院长的后续者是校长//请假3天的请假条LeaveNode leaveNode1 = new LeaveNode("张三", 3);instructor.handleRequest(leaveNode1);     //请假9天的请假条LeaveNode leaveNode2 = new LeaveNode("李四", 9);instructor.handleRequest(leaveNode2);//请假15天的请假条LeaveNode leaveNode3 = new LeaveNode("王五", 15);instructor.handleRequest(leaveNode3);//请假20天的请假条LeaveNode leaveNode4 = new LeaveNode("赵六", 20);instructor.handleRequest(leaveNode4);}
}

运行结果:

四、纯的与不纯的责任链模式:

(1)纯的责任链模式要求处理者对象只能在两个行为中选择一个:一是承担责任,二是把责任推给下家,不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。

(2)在纯的责任链模式里面,请求必须被某一个处理者对象所接收;在不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。


设计模式系列文章:

Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)

Java设计模式之创建型:建造者模式

Java设计模式之创建型:单例模式

Java设计模式之创建型:原型模式

Java设计模式之结构型:适配器模式

Java设计模式之结构型:装饰器模式

Java设计模式之结构型:代理模式

Java设计模式之结构型:桥接模式

Java设计模式之结构型:外观模式

Java设计模式之结构型:组合模式

Java设计模式之结构型:享元模式

Java设计模式之行为型:策略模式

Java设计模式之行为型:模板方法模式

Java设计模式之行为型:责任链模式

Java设计模式之行为型:观察者模式

Java设计模式之行为型:访问者模式

Java设计模式之行为型:中介者模式

Java设计模式之行为型:命令模式

Java设计模式之行为型:状态模式

Java设计模式之行为型:备忘录模式

Java设计模式之行为型:迭代器模式

Java设计模式之行为型:解释器模式


原博客链接:设计模式读书笔记-----职责链模式_chenssy 的技术博客-CSDN博客

Java设计模式之行为型:责任链模式相关推荐

  1. Java设计模式(九)责任链模式 命令模式

    (十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化.这种设计能够使得系统更加 ...

  2. 行为型设计模式(1)—— 责任链模式(Chain of Responsibility Pattern)

    文章目录 1.简介 2.使用场景 3.示例 4.变种 参考文献 1.简介 经常听身边的同事说其在项目中用到了责任链模式,今天就来学习一下什么是责任链模式. 责任链模式(Chain of Respons ...

  3. Java设计模式之行为型:解释器模式

    一.什么是解释器模式:         解释器模式,就是定义语言的文法,并建立一个解释器来解释该语言中的句子,通过构建解释器,解决某一频繁发生的特定类型问题实例. 这里我们将语言理解成使用规定格式和语 ...

  4. Java设计模式之行为型:访问者模式

    背景: 去医院看病时,医生会给你一个处方单要你去拿药,拿药我们可以分为两步走: (1)去柜台交钱,划价人员会根据处方单上的药进行划价,交钱. (2)去药房拿药,药房工作者同样根据处方单给你相对应的药. ...

  5. Java设计模式之行为型:状态模式

    背景: 介绍状态模式前,我们先看这样一个实例:公司力排万难终于获得某个酒店的系统开发项目,并且最终落到了你的头上.下图是他们系统的主要工作: 当第一眼看到这个系统时你就看出这是一个状态图,每个框都代表 ...

  6. Java设计模式之行为型:备忘录模式

    在开发过程中,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态.比如,在编程时假如编写失误,例如不小心误删除了几行代码,我们希望返回删除前的状态,便可以使用 Ctrl+Z 来进行返回,这时 ...

  7. Java设计模式之行为型:命令模式

    前言: 在开发中,我们可能需要向某些对象发送一些请求,但我们不知道请求的具体接收者是谁,也不知道被请求的操作是哪个,只知道在系统运行中指定具体的请求接收者即可,打个比方,电视遥控器,我们只需知道按哪个 ...

  8. Java设计模式之行为型:迭代器模式

    一.什么是迭代器模式: 实际开发中,我们针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但我们不希望在集合容器的抽象接口层中充斥着各种不同的遍历操作,这时候我们就需要一种能完成下面功能的迭代器 ...

  9. Java设计模式之行为型:模板方法模式

    一.什么是模板方法模式: 模板方法是基于继承实现的,在抽象父类中声明一个模板方法,并在模板方法中定义算法的执行步骤(即算法骨架).在模板方法模式中,可以将子类共性的部分放在父类中实现,而特性的部分延迟 ...

  10. Java设计模式之行为型:策略模式

    一.背景: 在开发中经常遇到这种情况,实现某个功能有多种算法策略,我们可以根据不同环境或者条件选择不同的算法策略来完成该功能,比如查找.排序等,一种常用方式是硬编码在一个类中,如需要提供多种查找算法, ...

最新文章

  1. Docker中的execdriver架构
  2. 机器学习--CART分类回归树
  3. 新字符设备驱动实验(自动分配设备号、自动创建应用层设备节点、新字符设备注册到内核的结构体)
  4. 安卓逆向_19( 二 ) --- APK保护策略【重新签名后安装打开失败 --- 书旗小说.apk、浦发银行.apk的过签名校验【so 文件修改保存】】
  5. 一次打卡软件的实战渗透测试
  6. 【今日CV 计算机视觉论文速览】Wed, 27 Mar 2019
  7. 云服务的可服务性经典6问
  8. java实现爬虫_手把手教你从零开始用Java写爬虫
  9. URDF文件导入Simscape后生成slx文件
  10. 电路基础知识之有源晶振设计
  11. 支付户+存管户基本解释
  12. 幼儿使用计算机需要注意事项,儿童玩电脑的优缺点及注意事项
  13. opengl开发环境搭建
  14. 搭建CocoaPods私有库
  15. SonicWall防火墙销量超300万套,合作伙伴项目报备量增长50%,
  16. html编辑器自定义脚本,我的自定义MAX脚本编辑器,代码高亮功能
  17. 一个两自由度DIY云台+OpenMV就可以实现简单云台跟踪了,以前的板球控制系统感觉也可以看作一种变相的云台跟踪啊!
  18. 卡尔曼滤波与组合导航原理_基于RAEKF的GPS/INS紧组合导航方法研究
  19. [全国牙防组]事件-惊!两个人两张桌忽悠了13亿人
  20. 基于加权对立和贪婪搜索多模态工程问题的黑猩猩优化算法附Matlab代码

热门文章

  1. kaggle (自杀分析)
  2. keras从入门到放弃(十八)批量标准化
  3. 微信小程序学习笔记(四)
  4. tensorflow从入门到放弃(一)
  5. 深圳内推 | 粤港澳大湾区数字经济研究院招聘NLP算法研究员(可实习)
  6. 从知识图谱到文本:结合局部和全局图信息生成更高质量的文本
  7. mysql 忘记root_解决MySQL忘记root密码
  8. 【虚拟化】docker部署Rabbitmq
  9. 简单几步让你实现本地jar包引入到maven当中
  10. 手把手带你领略双十一背后的核心技术Sentinel之热点参数限流