1.1概述

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

责任链模式是使用多个对象处理用户请求的成熟模式,责任链模式的关键是将用户的请求分派给许多对象,这些对象被组织成一个责任链,即每个对象含有后继对象的引用,并要求责任链上的每个对象,如果能处理用户的请求,就做出处理,不再将用户的请求传递给责任链上的下一个对象;如果不能处理用户的请求,就必须将用户的请求传递给责任链上的下一个对象。

1.2模式的结构

责任链模式的结构总包括两种角色:

(1)处理者(Handler):处理者是一个接口,负责规定具体处理者处理用户请求的方法,以及具体处理者设置后继对象的方法。

(2)具体处理者(ConcreteHandler):具体处理者是实现处理者接口的类的实例。具体处理者通过调用处理者接口规定的方法处理用户的请求,即在接到用户的请求后,处理者将调用接口规定的方法,在执行该方法的过程中,如果发现能处理用户的请求,就处理有关数据,否则就反馈无法处理的信息给用户,然后将用户的请求传递给自己的后继对象。

责任链模式结构的类图如下所示:

1.3责任链模式的优点

(1)责任链中的对象只和自己的后继是低耦合关系,和其他对象毫无关联,这使得编写处理者对象以及创建责任链变得非常容易。

(2)当在处理者中分配职责时,责任链给应用程序更多的灵活性。

(3)应用程序可以动态地增加、删除处理者或重新指派处理者的职责。

(4)
应用程序可以动态地增加、删除处理者或重新指派处理者的职责。

(5)应用程序可以动态地改变处理者之间的先后顺序。

(6)使用责任链的用户不必知道处理者的信息,用户不会知道到底是哪个对象处理了它的请求。

1.4适合使用责任链模式的情景

(1)有许多对象可以处理用户的请求,希望程序在运行期间自动确定处理用户的那个对象。

(2)希望用户不必明确指定接受者的情况下,向多个接受者的一个提交请求。

(3)程序希望动态制定可处理用户请求的对象集合。

1.5责任链模式的使用

以下通过一个简单的问题来描述责任链模式汇总所涉及的各个角色。

用户提交一个个人身份证号码,想知道该人是否在北京、上海或天津居住。

针对上述问题,使用责任链模式设计一个系统来处理用户的请求。具体如下:

首先看一下本实例构建框架具体类和1.2模式的结构中类图的对应关系,如下图所示:

(1)处理者(Handler)

本问题中,处理者(Handler)接口的名字是Handler,代码如下:

package com.liuzhen.six_chainOfResponsibility;public interface Handler {public abstract void handleRequest(String number);public abstract void setNextHandler(Handler handler);
}

(2)具体处理者

对于本问题,一共有三个负责创建具体处理者的类,分别是Beijing、Shanghai和Tianjing,三个类的代码如下:

Beijing.java类:

package com.liuzhen.six_chainOfResponsibility;import java.util.ArrayList;public class Beijing implements Handler{private Handler handler;                //存放当前处理者后继的Handler接口变量private ArrayList<String> numberList;   //存放身份证号码的数组线性表
    Beijing(){numberList = new ArrayList<String>();numberList.add("123456789");        //这里使用模拟的身份证号码numberList.add("987654321");numberList.add("987212143");numberList.add("767734672");}public void handleRequest(String number){if(numberList.contains(number))System.out.println("该人在北京居住");else{System.out.println("该人不在北京居住");if(handler != null)handler.handleRequest(number);   //将请求传递给下一个处理者
        }}public void setNextHandler(Handler handler){this.handler = handler;}
}

Shanghai.java类:

package com.liuzhen.six_chainOfResponsibility;import java.util.ArrayList;public class Shanghai implements Handler{private Handler handler;                //存放当前处理者后继的Handler接口变量private ArrayList<String> numberList;   //存放身份证号码的数组线性表
    Shanghai(){numberList = new ArrayList<String>();numberList.add("234567891");        //这里使用模拟的身份证号码numberList.add("876543219");numberList.add("872121493");numberList.add("767734729");}public void handleRequest(String number){if(numberList.contains(number))System.out.println("该人在上海居住");else{System.out.println("该人不在上海居住");if(handler != null)handler.handleRequest(number);   //将请求传递给下一个处理者
        }}public void setNextHandler(Handler handler){this.handler = handler;}}

Tianjing.java类:

package com.liuzhen.six_chainOfResponsibility;import java.util.ArrayList;public class Tianjing implements Handler{private Handler handler;                //存放当前处理者后继的Handler接口变量private ArrayList<String> numberList;   //存放身份证号码的数组线性表
    Tianjing(){numberList = new ArrayList<String>();numberList.add("345678912");        //这里使用模拟的身份证号码numberList.add("886543219");numberList.add("972121493");numberList.add("667734729");}public void handleRequest(String number){if(numberList.contains(number))System.out.println("该人在天津居住");else{System.out.println("该人不在天津居住");if(handler != null)handler.handleRequest(number);   //将请求传递给下一个处理者
        }}public void setNextHandler(Handler handler){this.handler = handler;}
}

(3)具体使用

通过SixApllication类来具体实现上述相关类和接口,来实现适配器模式的运用,其代码如下:

package com.liuzhen.six_chainOfResponsibility;public class SixApplication {private Handler beijing,shanghai,tianjing;      //责任链上的对象public void createChain(){                      //建立责任链beijing = new Beijing();shanghai = new Shanghai();tianjing = new Tianjing();beijing.setNextHandler(shanghai);shanghai.setNextHandler(tianjing);}public void reponseClient(String number){      //响应用户的请求
        beijing.handleRequest(number);}public static void main(String args[]){SixApplication sixApplicaiton = new SixApplication();sixApplicaiton.createChain();sixApplicaiton.reponseClient("667734729");}
}

运行结果:

该人不在北京居住
该人不在上海居住
该人在天津居住

参考资料:

      1.Java设计模式/耿祥义,张跃平著.——北京:清华大学出版社,2009.5

转载于:https://www.cnblogs.com/liuzhen1995/p/5989208.html

设计模式学习笔记(六:责任链模式)相关推荐

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

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

  2. 设计模式学习笔记——享元(Flyweight)模式

    设计模式学习笔记--享元(Flyweight)模式 @(设计模式)[设计模式, 享元模式, flyweight] 设计模式学习笔记享元Flyweight模式 基本介绍 享元案例 类图 实现代码 Big ...

  3. 设计模式学习笔记——中介者(Mediator)模式

    设计模式学习笔记--中介者(Mediator)模式 @(设计模式)[设计模式, 中介者模式, Mediator] 设计模式学习笔记中介者Mediator模式 基本介绍 中介者案例 类图 实现代码 Me ...

  4. 设计模式学习笔记——单例(Singleton)模式

    设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...

  5. 设计模式学习笔记--Mediator 中介者模式

    我们知道面向对象应用程序是由一组为了提供某种服务而彼此交互的对象组成.当彼此引用的对象数量比较少时,此时对象之间就为直接交互(点对点).而当对象的数量增加时,这种直接交互会导致对象之间复杂的.混乱的引 ...

  6. 设计模式学习笔记--Flyweight享元模式

    Flyweight模式也叫享元模式,是由GoF提出的23种设计模式中的一种.Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用,所以叫享元.   此模式解决的是由于大量 ...

  7. 设计模式(四)责任链模式——责任链模式结构

    定义 责任链是行为型设计模式的一种,通过前一个处理者记录下一个处理者的方式形成一条处理链.客户端在调用时只需要将请求传递到责任上即可,无需关注链路中的具体的传递过程.而链路中内部的处理,是按照前一个处 ...

  8. 设计模式学习笔记--享元(Flyweight)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式 ...

  9. Android设计模式详解之责任链模式

    前言 责任链模式是行为型设计模式: 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 使用场景: 多 ...

  10. 设计模式第七讲-责任链模式

    简介 责任链模式的定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 图例 责任链-根据事情大小来决 ...

最新文章

  1. excel中日期设置星期
  2. 编程python爬取网页数据教程_实例讲解Python爬取网页数据
  3. SqlTransaction——事务详解 [转]
  4. Linux 2440 LCD 控制器
  5. C# windows定时服务+服务邮箱发送
  6. [转载] Python3中的表达式运算符
  7. matlab 1到无穷_从零开始的matlab学习笔记——(6)符号计算与极限
  8. 自然语言处理包pytorch、torchvision、torchtext安装(亲测有效)
  9. 2.学习管理系统项目学习一
  10. 单链表的逆置-C++实现(ok)
  11. [github高级控件]带你走近-自定义标签云
  12. 电脑屏幕总是晚上定时开启护眼模式,变成黄色?教你这招解决它
  13. android 自定义圆点,Android自定义带圆点的半圆形进度条
  14. 警告当当成错误 may be used uninitialized in this function [-Werror=maybe-uninitialized]
  15. 车载网络测试 - UDS诊断篇 - 诊断数据简析
  16. ImageView设置纯色图片颜色
  17. java图片裁剪和java生成缩略图
  18. Windows cmake 编译x86版本的opencv
  19. Swoft入门及技术指南
  20. 点对点传输协议计算机网络,什么是点对点协议(Point-To-Point Protocol)?

热门文章

  1. PowerDesigner的基本使用
  2. python mro c3_Python的MRO以及C3线性化算法
  3. python method_用实例分析Python中method的参数传递过程
  4. 系统学习机器学习之参数方法(二)
  5. 纯新手DSP编程--5.29--DSP/BIOS任务管理和后台线程
  6. linux qt计算器,QT 计算器小程序
  7. java中文乱码decode_Java WEB开发中的中文乱码问题解决
  8. C语言:求矩阵非对角线元素的和
  9. java web初始化实例_Struts2中实现web应用的初始化实例详解
  10. mysql安装无法创建mysqld_MySQL 5.7安装错误`mysqld:无法创建/写入文件’/ var / lib / mysql / is_writable’...