文章目录

  • 前言
  • 一、模式的定义与特点
  • 二、模式的结构与实现
  • 总结

前言

职责链模式:就是指发出问题的人,不要和解决问题的人,产生冲突,尤其是当能处理该问题的人很多的情况下。


提示:以下是本篇文章正文内容,下面案例可供参考

一、模式的定义与特点

定义
  为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
  在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递。所以责任链将请求的发送者和请求的处理者解耦了。
特点

  1. 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
  2. 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
  3. 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
  4. 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
  5. 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

其主要缺点

  1. 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
  2. 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
  3. 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

二、模式的结构与实现

首先要清楚它包含的角色

  1. 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  2. 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  3. 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

角色与角色之间的关系

实现代码

public class ChainOfResponsibilityPattern {public static void main(String[] args) {//组装责任链Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();handler1.setNext(handler2);//提交请求handler1.handleRequest("two");}
}
//抽象处理者角色
abstract class Handler {private Handler next;public void setNext(Handler next) {this.next = next;}public Handler getNext() {return next;}//处理请求的方法public abstract void handleRequest(String request);
}
//具体处理者角色1
class ConcreteHandler1 extends Handler {public void handleRequest(String request) {if (request.equals("one")) {System.out.println("具体处理者1负责处理该请求!");} else {if (getNext() != null) {getNext().handleRequest(request);} else {System.out.println("没有人处理该请求!");}}}
}
//具体处理者角色2
class ConcreteHandler2 extends Handler {public void handleRequest(String request) {if (request.equals("two")) {System.out.println("具体处理者2负责处理该请求!");} else {if (getNext() != null) {getNext().handleRequest(request);} else {System.out.println("没有人处理该请求!");}}}
}
/*
程序运行结果如下:
具体处理者2负责处理该请求!
*//*
在上面代码中,我们把消息硬编码为 String 类型,而在真实业务中,消息是具备多样性的,可以是 int、String 或者自定义类型。因此,在上面代码的基础上,可以对消息类型进行抽象 Request,增强了消息的兼容性。*/

总结

一个好的职责链使用,会大大节省系统的性能,同时还能避免代码之间出现冲突。

GOF---责任链模式(职责链模式)相关推荐

  1. 责任链模式(职责链模式)(Chain of Responsibility Pattern)

    学校OA 系统的采购审批项目:需求是 采购员采购教学器材 如果金额小于等于5000, 由教学主任审批(0<=x<=5000) 如果金额小于等于10000, 由院长审批(5000<x& ...

  2. 15、设计模式-行为型模式-职责链模式

    职责链模式 很多情况下,在一个软件系统中可以处理某个请求的对象不止一个,例如SCM系统中的采购 单审批,主任.副董事长.董事长和董事会都可以处理采购单,他们可以构成一条处理采购 单的链式结构,采购单沿 ...

  3. 《设计模式详解》行为型模式 - 职责链模式

    职责链模式 6.4 职责链模式 6.4.1 概述 6.4.2 结构 6.4.3 案例实现 6.4.4 优缺点 6.4.5 JavaWeb 源码 - FilterChain 完整的笔记目录:<设计 ...

  4. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  5. JS模式--职责链模式

    职责链模式的定义:使用多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链, 并沿着这条链条传递下去,直到有一个对象处理它为止. var order500 = f ...

  6. 5.js模式-职责链模式

    1. 职责链模式 将对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. var chain = function(fn){ this.fn = fn; this.successor = ...

  7. 十八、职责链模式-推卸责任,不关我的事,我不管!#和设计模式一起旅行#

    不在其位,不谋其政! –出自<论语·泰伯> 故事背景 在现实世界中,有很多情况下会遇到一些推卸责任的场景,比如要办理一件事的时候,被告诉你要去做个做这个事情,但是去了这个地方,确告诉要到另 ...

  8. C#设计模式学习笔记:(20)职责链模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8109100.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第八个模式--职 ...

  9. 职责链模式(Chain of Responsibility)(对象行为型)

    1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...

  10. Python设计模式-职责链模式

    Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...

最新文章

  1. python read函数返回值_python read()方法定义及使用(实例解析)
  2. 步入DevExpress的使用(VS)
  3. SCSM 2012Orchestrator 2012 虚拟机自动交付测试
  4. SpringBoot项目部署到独立的Tomcat上
  5. python使用的编辑器_我用过的最好的python编辑器PyScripter
  6. jvm形象简介之一看就懂
  7. python 并列条形图_python – 如何绘制具有相同X坐标并排的条形图
  8. BootStrap笔记-img相关
  9. mysql binlog DDL_MySQL binlog原理及应用
  10. 叉积 微分 恒等式_4分钟带你认识向量的极化恒等式。
  11. AI学习笔记(十五)自然语言处理基本概念
  12. 浙江法院智能语音识别系统全面上线
  13. Windows安装zookeeper和kafka
  14. 安卓一键清理内存_教大家安卓怎么清理内存-装修攻略
  15. 周末闲来——2048游戏开发
  16. 柯林斯第八版高阶字典前缀
  17. 数字VR虚拟博物馆的功能介绍
  18. admin_day2
  19. 清晰明朗创意无限的透明名片设计
  20. 大自然背景的清晨闹铃.wav

热门文章

  1. 对方不想和你说话 php,女生说不想和你说话怎么回答 女生说不想说话是什么意思...
  2. 软件测试之魂:核心测试设计精解(第2版)》
  3. 算法题(四十):BFS解决网易2017年笔试题——地牢逃脱
  4. 《合金装备4》的秘密!小岛秀夫访谈录
  5. js日期加减一天_JS日期加减,日期运算代码
  6. route虚拟服务器模拟,Windows Server 2012R2 路由和网桥设置
  7. 题目:宝石合成 python题解
  8. 2K屏+144Hz高速刷新,神器级电竞游戏显示器装备
  9. 记录四图像处理之瘦脸 MLS算法 C++实现
  10. 安卓实现视频直播(rtmp)以及直播推流(NDK实现)