参考文章:http://wiki.jikexueyuan.com/project/design-pattern-behavior/chain-four.html

定义:

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

分类:

  • 纯的职责链模式

一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个:要么承担全部责任,要么将责任推给下家,不允许出现某一个具体处理者对象在承担了一部分或全部责任后又将责任向下传递的情况。而且在纯的职责链模式中,要求一个请求必须被某一个处理者对象所接收,不能出现某个请求未被任何一个处理者对象处理的情况。在前面的采购单审批实例中应用的是纯的职责链模式。

  • 不纯的职责链模式

在一个不纯的职责链模式中允许某个请求被一个具体处理者部分处理后再向下传递,或者一个具体处理者处理完某请求后其后继处理者可以继续处理该请求,而且一个请求可以最终不被任何处理者对象所接收。

uml类图:

模式组成:

  • Handler : 抽象处理者角色,声明一个请求处理的方法,并保持下一个处理节点 Handler 对象的引用.
  • ConcreteHandler : 具体处理者角色,对请求进行处理,如果不能处理,则将请求传递给下一个节点Handler

优点:

  • 责任链模式减低了发出命令的对象和处理命令的对象之间的耦合
  • 发出命令的对象只是把命令传给链结构的起始者,而不需要知道到底是链上的哪一个节点处理了这个命令。
  • 在给对象分派职责时,职责链可以给我们更多的灵活性,可以通过在运行时对该链进行动态的增加或修改来增加或改变处理一个请求的职责。
  • 在系统中增加一个新的具体请求处理者时无须修改原有系统的代码,只需要在客户端重新建链即可,从这一点来看是符合“开闭原则”的。

缺点:

  • 由于一个请求没有明确的接收者,那么就不能保证它一定会被处理,该请求可能一直到链的末端都得不到处理;一个请求也可能因职责链没有被正确配置而得不到处理。
  • 所有责任开始都是从指定的接收者依次传递下去,运行中无法从中间开始传递

应用场景:

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

实际应用:

  • Java的异常机制就是一个责任链模式,一个try可以对应多个cathc。如果某一个catch不匹配,则跳到下一个catch中
  • Servlet开发中,过滤器的链式处理
  • Struts2中,拦截器的处理

举个栗子:

(审批流程)

定义抽象处理角色

interface Handler {
public boolean handleRequest(Request request);
public String getName();
}

定义一个请求类

class Request {
public int getLeaveDays() {
return 4;
}
}

定义一个具体处理角色

class Manager implements Handler {

    @Override
public boolean handleRequest(Request request) {
if (request.getLeaveDays() > 5) {
return false;
}
return true;
} @Override
public String getName() {
return "部门经理";
}
}

定义一个具体处理角色

class CTO implements Handler {

    @Override
public boolean handleRequest(Request request) {
if (request.getLeaveDays() > 3) {
return false;
}
return true;
} @Override
public String getName() {
return "技术总监";
}
}

初始化责任链,并调用

public class ChainOfResponsibilityTest {
static List<Handler> handlers = new ArrayList<Handler>();
static{
handlers.add(new Manager());
handlers.add(new CTO());
}
public static void main(String[] args) { for (Handler h : handlers) {
if (!h.handleRequest(new Request())) {
System.out.println("该次请假未通过审批,审批人:"+h.getName());
}
}
}
}

输出

责任链模式(chainOfResponsibility)的更多相关文章

  1. 学习笔记——责任链模式ChainOfResponsibility

    责任链模式,主要是通过自己记录一个后继者来判断当前的处理情况.Handler中,再增加一个方法用于设置后继对象,如SetHandler(Handler obj). 然后Handler类以其子类的处理方 ...

  2. Java设计模式偷跑系列(十八)建模和责任链模式的实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每一 ...

  3. [19/04/29-星期一] GOF23_行为型模式(责任链模式、迭代器模式)

    一.行为模式 二.责任链模式(chainOfResponsibility) [一个请求类] /*** 请假类 * 封装请假的基本信息 */ package cn.sxt.chainOfResponsi ...

  4. 十四、ChainOfResponsibility 责任链模式

    设计: 代码清单: Trouble: public class Trouble { private int number; public Trouble(int number){ this.numbe ...

  5. chainOfResponsibility责任链模式

    责任链(Chain of Responsibility)模式 : 责任链模式是对象的行为模式.使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系.将这些处理对象连成一条链,沿着这条 ...

  6. C#设计模式-责任链模式

    在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所以在面试的 ...

  7. C#设计模式(21)——责任链模式

    一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1万的薪水可能技术经理就可以决定了,但是1万~1万5的薪水可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所 ...

  8. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

  9. 24种设计模式--责任链模式【Chain ofResponsibility Pattern】

    中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父.既嫁从夫.夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的,举个例子来说,一个女 ...

随机推荐

  1. ERP会计科目表初始化

    2019会计科目表 一.资产类 顺序号 编号 会计科目名称 会计科目适用范围 顺序号 编号 会计科目名称 会计科目适用范围 1 1001 库存现金 38 1431 周转材料 建造承包商专用 2 100 ...

  2. python的new与init

    基于文章:Why is init() always called after new()? 特别说明: 这篇文章的灵感来源于stackoverflow的一个提问,准确说,我只是做了些知识梳理的工作,对 ...

  3. sql语句技巧

    应用场景:当sql 语句中where后面的条件字段为空的时候,条件不存在 eg:根据传入的参数,从student表中查询数据,参数包含姓名(name 必有),年龄(age 不一定有),性别(gende ...

  4. 【转】Webpack 快速上手(下)

    由于文章篇幅较长,为了更好的阅读体验,本文分为上.中.下三篇: 上篇介绍了什么是 webpack,为什么需要 webpack,webpack 的文件输入和输出 中篇介绍了 webpack 在输入和输出 ...

  5. 分析一个UBOOT的方法

    1. 编译完成后可以看到在主目录下生成了uboot.bin文件,为了方便分析,使用如下命令将其反汇编:arm-linux-objdump -D -m arm u-boot > u-boot.as ...

  6. CC2530 light_switch分析

    一些关键字: CCM  - Counter with CBC-MAC (mode ofoperation) HAL   - HardwareAbstraction Layer      (硬件抽象层) ...

  7. .NET Core中Quartz.NET的依赖注入

    目录 介绍 项目概况 创建配置文件 使用构造函数注入 使用选项模式 结论 介绍 Quartz.NET是一个方便的库,允许您通过实现IJob接口来安排重复任务.然而,它的局限性在于,默认情况下,它仅支持 ...

  8. 删除或关闭Word中的超链接

    最近使用的word老是会把一些文字内容或者标题转换成乱七八糟的格式,看的莫名其妙的,找了好久也不知道什么问题,后来一查才知道是因为这些文字包含超链接,word自动转换了...你说是不是莫名其妙. 要关 ...

  9. javascript学习5、JS面向对象

    创建对象的几种常用方式 1.使用Object或对象字面量创建对象 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对象 1.使用Object或对象字面量创建对象 JS中最基本创建对象的 ...

  10. 织梦DedeCms网站内部SEO详细分析

    一.确定网站的目标关键词 最为重要的一方面,一般网站首页的目标关键词建议在1-3个.对于目标关键词的选取有几个建议 1.定位:网站的内容和业务相关 2.分析:对用户体验及竞争对手的网站进行分析 3.筛 ...