模式导读:

作为一名大学生,相信我们都有过请假的经历,在我们请假是总会碰到这样的场景,就是当请假的时间超过5天(包括5天),我们的请假条就不能由班主任进行审阅通过了,而是需要上交院系,由院领导进行审阅通过,当请假的时间超过一个月,就得由学校的教务处进行审阅通过。这便是在其位司其职,职责链模式也就相当于给了不同角色不同权限,权限低的不能去执行权限高的任务。

参考类图:

责任链模式涉及到的角色如下所示:

●  抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

●  具体处理者(Department/Leader/HeadTeacher)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

代码实现:

1.首先要有一个抽象的处理者类,在其中要包含对具体处理者角色的引用,同时定义一个处理请求的抽象方法

1 packagecom.etc;2 //定义一个抽象的处理者类

3 public abstract classHandler {4 publicHandler sucesser;5

6 //定义一个抽象的处理请求的方法

7 public abstract String handlerRequest(String user,intdays);8

9 //获取当前角色的下一个处理者角色

10 publicHandler getNextHandler() {11 returnsucesser;12 }13 //设置当前角色的下一个处理者角色

14 public voidsetNextHandler(Handler sucesser) {15 this.sucesser=sucesser;16 }17

18 }

2.然后定义具体的处理者角色,根据不同情况加以判断处理情况

(1)HeadTeacher.java

1 packagecom.etc;2

3 //班主任处理请假请求

4 public class HeadTeacher extendsHandler {5 @Override6 public String handlerRequest(String user, intdays) {7 if (days < 5) {8 System.out.println("班主任同意" + user + "同学的请假请求");9 } else{10 System.out.println("班主任无法处理" + user + "同学的请假请求");11 }12 //如果下一个执行者不为空,由下一个执行者执行

13 if (getNextHandler() != null) {14 returngetNextHandler().handlerRequest(user, days);15 }16 return null;17 }18

19 }

(2)Department.java

1 packagecom.etc;2

3 //院系主任处理请假请求

4 public class Department extendsHandler {5

6 @Override7 public String handlerRequest(String user, intdays) {8

9 if (days < 30) {10 System.out.println("院系主任同意" + user + "同学的请假请求");11 } else{12 System.out.println("院系主任无法处理" + user + "同学的请假请求");13 }14 if (getNextHandler() != null) {15 returngetNextHandler().handlerRequest(user, days);16 }17 return null;18 }19

20 }

(3)Leader.java

1 packagecom.etc;2

3 //校级主任处理请假请求

4 public class Leader extendsHandler {5

6 @Override7 public String handlerRequest(String user, intdays) {8 if (days >= 30) {9 System.out.println("校级主任同意" + user + "同学的请假请求");10 } else if (getNextHandler() != null) {11 returngetNextHandler().handlerRequest(user, days);12 }13 return null;14 }15

16 }

3.具体的客户端类

1 packagecom.etc;2

3 public classClient {4

5 public static voidmain(String[] args) {6 //获取三个不同的处理者对象

7 Handler h1 = newHeadTeacher();8 Handler h2 = newDepartment();9 Handler h3 = newLeader();10

11 //设置角色的处理层次

12 h2.setNextHandler(h3);13

14 h1.handlerRequest("李四", 5);15 System.out.println("*************************");16 h2.handlerRequest("王五", 15);17 System.out.println("*************************");18 h2.handlerRequest("朱七", 30);19

20 }21

22 }

运行效果截图:

职责链模式的优缺点:

优点:

(1) 职责链模式使得一个对象无须知道是其他哪一个对象处理其请求,对象仅需知道该请求会被处理即可,接收者和发送者都没有对方的明确信息,且链中的对象不需要知道链的结构,由客户端负责链的创建,降低了系统的耦合度。

(2) 请求处理对象仅需维持一个指向其后继者的引用,而不需要维持它对所有的候选处理者的引用,可简化对象的相互连接。

(3) 在给对象分派职责时,职责链可以给我们更多的灵活性,可以通过在运行时对该链进行动态的增加或修改来增加或改变处理一个请求的职责。

(4) 在系统中增加一个新的具体请求处理者时无须修改原有系统的代码,只需要在客户端重新建链即可,从这一点来看是符合“开闭原则”的。

缺点:

(1) 由于一个请求没有明确的接收者,那么就不能保证它一定会被处理,该请求可能一直到链的末端都得不到处理;一个请求也可能因职责链没有被正确配置而得不到处理。

(2) 对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便。

(3) 如果建链不当,可能会造成循环调用,将导致系统陷入死循环。

适用场景:

(1) 有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行时刻再确定,客户端只需将请求提交到链上,而无须关心请求的处理对象是谁以及它是如何处理的。

(2) 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

(3) 可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求,还可以改变链中处理者之间的先后次序。

java 职责链模式_java设计模式-职责链模式相关推荐

  1. Java创新型模式_java设计模式--创建型模式(一)

    2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...

  2. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  3. java解耦的模板模式_Java 设计模式(9) —— 模板模式

    一.模板模式 封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现.模板模式可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板模式 二.示例 泡咖啡与泡茶: 泡咖啡的步骤: 水 ...

  4. java策略模式_Java设计模式之策略模式详解

    本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Def ...

  5. java抽象工厂模式_JAVA设计模式-抽象工厂模式

    定义 抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构. 抽象工厂模 ...

  6. java bridge 模式_Java设计模式之桥模式(Bridge模式)介绍

    Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...

  7. java模板方法模式_java设计模式(模板方法模式)

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

  8. java 模板模式_java设计模式之模板模式

    模板模式 模板模式(Template Pattern),定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤.这种类型的设计模式属于 ...

  9. java的visitor模式_Java设计模式之Visitor模式是什么样的?

    作用于某个对象群中各个对象的操作.它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作.在Java中,Visitor模式实际上是分离了collection结构中的元素和对这些元素进行操作 ...

最新文章

  1. opencv 霍夫曼变换 直线提取
  2. 使用websockets,后台实时发数据,前台实时接受数据,并集成到Django
  3. VMware搭建Android x86
  4. MarshalByRefObject 的DOME代码
  5. android 75 新闻列表页面
  6. UILabel常用属性
  7. php sql语句计算距离,sql计算经纬度得出最近距离的公式
  8. 为什么考研的都不是班里最优秀的?
  9. 微软2月修复99个漏洞,含1个 0day
  10. WannaCry 勒索病毒用户处置指南
  11. html 设计页面,HTML5网页设计
  12. 淘宝客高手必备的14大WordPress插件
  13. linux/unix系统下IOZONE/iozone磁盘性能测试工具方法
  14. mac 回车键、空格键失灵(非物理原因)解决方法
  15. android开发--不安装支付宝客户端调H5页面问题
  16. mysql constant number,Mysql报Too many connections,不要乱用ulimit了,看看如何正确修改进程的最大文件数...
  17. 启动某个程序的时候,提示端口8000被占用解决方式
  18. 单向链表—在单向链表的头部插入一个元素
  19. librecad二次开发
  20. BERT-BiLSTM-CRF模型代码

热门文章

  1. 如何无损截取多个视频画面
  2. VS编译器、C++、C如何折叠代码
  3. 如何在word中批量修改图片大小
  4. 一个高端大气上档次的后台管理界面
  5. 机器学习做自动聊天机器人_当您14岁时建立和销售聊天机器人会是什么样的感觉...
  6. 增强方法有几种方法_101种使您的网站更加出色的方法
  7. 基于系统日志分析进行异常检测
  8. “可再生资源回收”英语怎么说
  9. 超次元大海战如何用电脑玩 超次元大海战手游PC电脑版教程
  10. 山东大学教授团畅谈ChatGPT革命座谈会,探讨ChatGPT发展趋势