概念:

  Chain of Responsibility(CoR)模式也叫职责链模式、责任链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被称作职责链模式。

  职责链模式的应用场景

  例1:比如客户Client要完成一个任务,这个任务包括a,b,c,d四个部分。首先客户Client把任务交给A,A完成a部分之后,把任务交给B,B完成b部分之后,把任务交给C,C完成c部分之后,把任务交给D,直到D完成d部分。

  例2:比如政府部分的某项工作,县政府先完成自己能处理的部分,不能处理的部分交给省政府,省政府再完成自己职责范围内的部分,不能处理的部分交给中央政府,中央政府最后完成该项工作。

  例3:SERVLET容器的过滤器(Filter)框架实现。

  下面,举一个例子,假如我们要造汽车,制造汽车的流程是先制造车头,再制造车身,最后制造车尾

  我们先不用职责链模式

  首先,新建一个制造汽车流程的抽象类

  1. /*
  2. * 制造汽车流程抽象类
  3. */
  4. public abstract class CarHandler {
  5. public abstract void HandlerCar();
  6. }

  制造车头

  1. /*
  2. * 制造车头
  3. */
  4. public class CarHeadHandler extends CarHandler {
  5.  
  6. @Override
  7. public void HandlerCar() {
  8. System.out.println("制造车头");
  9. }
  10. }

  制造车身

  1. /*
  2. * 制造车身
  3. */
  4. public class CarBodyHandler extends CarHandler {
  5.  
  6. @Override
  7. public void HandlerCar() {
  8. System.out.println("制造车身");
  9. }
  10. }

  制造车尾

  1. /*
  2. * 制造车尾
  3. */
  4. public class CarTailHandler extends CarHandler {
  5.  
  6. @Override
  7. public void HandlerCar() {
  8. System.out.println("制造车尾");
  9. }
  10. }

  客户端

  1. public class MainClass {
  2. public static void main(String[] args) {
  3. CarHandler carHead = new CarHeadHandler();
  4. CarHandler carBody = new CarBodyHandler();
  5. CarHandler carTail = new CarTailHandler();
  6.  
  7. carHead.HandlerCar();
  8. carBody.HandlerCar();
  9. carTail.HandlerCar();
  10. }
  11. }

  运行结果:

  可以看到这种形式,制造汽车的每一步都需要用户来完成,用户制造完车头了,再由用户去制造车身,非常麻烦。

  我们想要的是什么,用户制造汽车,制造完车头了,自动的去制造车身,然后再自动的去制造车尾。这就需要用到职责链模式了。

  职责链模式的基本条件

  要实现Chain of Responsibility模式,需要满足该模式的基本条件:

  1,对象链的组织。需要将某任务的所有职责执行对象以链的形式加以组织。

  2,消息或请求的传递。将消息或请求沿着对象链传递,以让处于对象链中的对象得到处理机会。

  3,处于对象链中的对象的职责分配。不同的对象完成不同的职责。

  4,任务的完成。处于对象链的末尾的对象结束任务并停止消息或请求的继续传递。

  职责链模式的结构

  

  职责链模式的角色和职责

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

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

  下面,用职责链模式实现一下刚才的功能

  首先,新建抽象处理者(Handler)角色也就是制造汽车流程的抽象类,在刚才的基础基础上增加一个成员属性,并提供一个set方法、

  1. /*
  2. * 制造汽车流程抽象类
  3. */
  4. public abstract class CarHandler {
  5. //提供一个CarHandler类型属性,记录下一个要执行的流程
  6. private CarHandler carHandler;
  7. //提供一个getNext方法,用来得到下一个要执行的流程
  8. public CarHandler getNextCarHandler() {
  9. return carHandler;
  10. }
  11. //提供一个setNext方法,用来给属性赋值
  12. public void setNextCarHandler(CarHandler carHandler) {
  13. this.carHandler = carHandler;
  14. }
  15.  
  16. public abstract void HandlerCar();
  17. }

  接着新建三个流程

  1. /*
  2. * 制造车头
  3. */
  4. public class CarHeadHandler extends CarHandler {
  5.  
  6. @Override
  7. public void HandlerCar() {
  8. System.out.println("制造车头");
  9. //如果当前流程不是最后一个流程,继续执行下一个流程
  10. if(this.getNextCarHandler() != null){
  11. this.getNextCarHandler().HandlerCar();
  12. }
  13. }
  14. }
  1. /*
  2. * 制造车身
  3. */
  4. public class CarBodyHandler extends CarHandler {
  5.  
  6. @Override
  7. public void HandlerCar() {
  8. System.out.println("制造车身");
  9. //如果当前流程不是最后一个流程,继续执行下一个流程
  10. if(this.getNextCarHandler() != null){
  11. this.getNextCarHandler().HandlerCar();
  12. }
  13. }
  14. }
  1. /*
  2. * 制造车尾
  3. */
  4. public class CarTailHandler extends CarHandler {
  5.  
  6. @Override
  7. public void HandlerCar() {
  8. System.out.println("制造车尾");
  9. //如果当前流程不是最后一个流程,继续执行下一个流程
  10. if(this.getNextCarHandler() != null){
  11. this.getNextCarHandler().HandlerCar();
  12. }
  13. }
  14. }

  最后是客户端

  1. public class MainClass {
  2. public static void main(String[] args) {
  3. CarHandler carHead = new CarHeadHandler();
  4. CarHandler carBody = new CarBodyHandler();
  5. CarHandler carTail = new CarTailHandler();
  6.  
  7. //组装顺序预先设定好,顺序是车头,车身,车尾(真正开发也可以封装成一个单独的功能模块)
  8. carHead.setNextCarHandler(carBody);
  9. carBody.setNextCarHandler(carTail);
  10. //调用职责链模式的链头来完成操作
  11. carHead.HandlerCar();
  12. }
  13. }

  职责链模式的优缺点

  优点:

  1、责任的分担。每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。

  2、可以根据需要自由组合工作流程。如工作流程发生变化,可以通过重新分配对象链便可适应新的工作流程。

  3、类与类之间可以以松耦合的形式加以组织。

  缺点:

  因为处理时以链的形式在对象间传递消息,根据实现方式不同,有可能会影响处理的速度。

java设计模式-----18、职责链模式的更多相关文章

  1. java设计模式之职责链模式

    责任链模式 设计模式很多时候都是看见名字都知道意思,责任链,见名知义为请求创建一系列处理对象. 此模式基于请求的类型将请求的发送方和接收方分离.通常每个接收器包含对另一个接收器的引用.如果一个对象不能 ...

  2. 设计模式之职责链模式(JAVA实现)

    学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没 ...

  3. php设计模式之职责链模式

    <?php /** * @desc php设计模式之职责链模式(责任链模式) 定义:顾名思义,责任链模式为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这 ...

  4. 设计模式-利用职责链模式消除if

    本文是对职责链设计模式的应用(变种),所以假设读者已经掌握了职责链设计模式,职责链模式只会应景简介. 本文主要内容: 需求(ShitCode) 职责链模式简介 设计理念 代码演示(消除if) 应用总结 ...

  5. Java设计模式之责任链模式、职责链模式

    本文继续介绍23种设计模式系列之职责链模式.   什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组.   职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...

  6. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. Java设计模式之职责型模式总结

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6548127.html 所谓职责型模式,就是采用各种模式来分配各个类的职责. 职责型模式包括 ...

  8. Java设计模式之职责链设计模式

    1.什么是-职责链设计模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求 ...

  9. Java设计模式---ChainOfResponsibility责任链模式

    参考于 : 大话设计模式 马士兵设计模式视频 代码参考于马士兵设计模式视频 写在开头:职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系 图来自大话设计模式,下面我的代 ...

  10. 设计模式:职责链模式(Chain Of Responsibility)

    定  义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 结构图: 处理请求类: //抽象处理类 abs ...

随机推荐

  1. 弦论(tjoi2015,bzoj3998)(sam(后缀自动机))

    对于一个给定长度为\(N\)的字符串,求它的第\(K\)小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串\(S\) 第二行为两个整数\(T\)和\(K\),\(T\)为0则表示不同 ...

  2. django 自定义中间件 middleware

    Django 中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强 ...

  3. 四,mysql优化——sql语句优化之索引二

    1,在什么列适合添加索引 (1)较频繁的作为查询条件字段应该添加索引 select * from emp where empid = 2; (2)唯一性太差的字段不适合添加索引,即时频繁作为查询条件. ...

  4. express form/ajax 后端获取前端数据

    -------------------2017/12/02补充:缺了一个重要条件... var bodyParser = require('body-parser');var app = expres ...

  5. linux系统上内网ip和和外网ip的关系

    1.不同服务之间的访问需要使用公网IP+端口才能访问 2.服务器上一般都是域名访问,服务器会把ip+端口映射成固定的域名,所以如果想访问服务器上其他应用,就必须的放开应用限制 问题,在服务器上放开对某 ...

  6. C#之初识单例模式

    当我们使用QQ的时候就会发现,他可以启动多个QQ,但是有时候,我们不想这样做,这时候我们就需要使用到单例模式. 1.将Form2的构造函数转为私有 using System.Windows.Forms ...

  7. php-fpm定时器

    php-fpm有三种定时器 1)主进程接收到用户的信号,例如sigusr,主进程执行kill(子进程号,sigquit),的同时,设置定时器,在一个无限循环里如果当前时间 大于或等于 该定时器的过期时 ...

  8. 【xsy1097】 拼图 构造题

    题目大意:请你使用n个图形拼成一个矩形.要求:①这每个图形都由1×1的小正方形组成,而且第i个图形由i个小正方形组成.②除了第1个和第2个图形以外,任意一个图形的所有小正方形,不都在一条直线上. 数据 ...

  9. subscripts(下标)

    /* subscripts(下标): 访问对象中数据的快捷方式 所谓下标脚本语法就是能够通过, 实例[索引值]来访问实例中的数据 类似于以前我们访问数字和字典, 其实Swift中的数组和字典就是一个结 ...

  10. oracle_jdbc_insert_into

    package com.ayang.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.S ...