一、概述

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

二、适用性

1.有多个对象可以处理一个请求,到底是哪个对象处理请求,交由运行时刻自动确定的时候。

2.你想在不明确指定接收者的情况下,向多个对象中的一个发送请求的时候。

3.可以处理一个请求的对象集合应该被动态指定的时候。

三、参与者

1.Handler:定义一个处理请求的接口。可能的话实现后继链(option)。

2.ConcreteHandler:链上的具体处理者。处理它负责的请求。可以访问它的后继。如果可以处理该请求,就处理;否则将该请求转发给其后继。

3.Client:向链上的具体处理者对象提交请求。

四、类图

五、示例

Handler

  1. package cn.lynn.chainofresponsibility;
  2. public interface IRequestHandler {
  3. public void handleRequest(IRequest request);
  4. }

ConcreteHandler

  1. package cn.lynn.chainofresponsibility;
  2. public class SunRequestHandler implements IRequestHandler {
  3. @Override
  4. public void handleRequest(IRequest request) {
  5. if(request instanceof FightRequest) {
  6. System.out.println("悟空火眼金睛,三打白骨精!");
  7. }
  8. }
  9. }
  1. package cn.lynn.chainofresponsibility;
  2. public class ZhuRequestHandler implements IRequestHandler {
  3. private IRequestHandler handler;
  4. public ZhuRequestHandler(IRequestHandler handler) {
  5. this.handler = handler;
  6. }
  7. @Override
  8. public void handleRequest(IRequest request) {
  9. if(request instanceof PeepRequest) {
  10. System.out.println("八戒偷窥嫦娥,被贬下凡!");
  11. }
  12. handler.handleRequest(request);
  13. }
  14. }
  1. package cn.lynn.chainofresponsibility;
  2. public class ShaRequestHandler implements IRequestHandler {
  3. private IRequestHandler handler;
  4. public ShaRequestHandler(IRequestHandler handler) {
  5. this.handler = handler;
  6. }
  7. @Override
  8. public void handleRequest(IRequest request) {
  9. if(request instanceof FindRequest) {
  10. System.out.println("师傅让妖怪抓走了,沙增找不到!");
  11. }
  12. handler.handleRequest(request);
  13. }
  14. }

Client

  1. package cn.lynn.chainofresponsibility;
  2. public class Client {
  3. public static void main(String[] args) {
  4. IRequestHandler sun = new SunRequestHandler();
  5. IRequestHandler zhu = new ZhuRequestHandler(sun);
  6. IRequestHandler sha = new ShaRequestHandler(zhu);
  7. IRequest request = new FindRequest();
  8. sha.handleRequest(request);
  9. request = new PeepRequest();
  10. zhu.handleRequest(request);
  11. request = new FightRequest();
  12. sun.handleRequest(request);
  13. }
  14. }

Result

  1. 师傅让妖怪抓走了,沙增找不到!
  2. 八戒偷窥嫦娥,被贬下凡!
  3. 悟空火眼金睛,三打白骨精!
 
 

GoF23种设计模式之行为型模式之责任链模式的更多相关文章

  1. 设计模式之jdk动态代理模式、责任链模式-java实现

    设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...

  2. Java 设计模式系列(二二)责任链模式

    Java 设计模式系列(二二)责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求 ...

  3. Delphi 设计模式:《HeadFirst设计模式》---行为模式之责任链模式

    模式解说 责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 通常使用在以下场合 1 有多个对象可以处理一个请求,哪个对象处理该请 ...

  4. Python的组合模式与责任链模式编程示例

    Python的组合模式与责任链模式编程示例 这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下 组合模式 我们把Com ...

  5. Java设计模式(19)——行为模式之责任链模式(chain of responsibilitiy)

    一.概述 概念 UML简图 角色 抽象处理器:定义处理请求的接口 具体处理器:接收到请求后可以选择处理,也可以选择发给下家处理(持有下家的引用) 当然这里必须指出,实际中纯的责任链模式很难寻找,一般是 ...

  6. 设计模式之(十四)责任链模式(Chain of Responsibility)

    在业务场景中,有很多是需要审批的.审核方式还可能常常发生变化,而责任链模式就是为了解决这种场景的情况的. 责任链模式定义:十多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系.讲这些对象连 ...

  7. 【责任链模式】责任链模式结合Spring实战Demo

    备注: 责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的if-else逻辑 主要区别在于: 策略模式 封装了算法,通过上下文对象去接受客户端的数据,根据数据类型执行不同的算法 ...

  8. 十一个行为模式之责任链模式(Responsible Chain Pattern)

    定义: 将具有相同接口的责任类串行在一起,解耦请求的发送者和处理者.沿着这条链进行请求,直到有对象处理它为止. 结构图: Handler:抽象处理类,定义了所有责任类处理方法的接口,不同的处理方法在子 ...

  9. Java设计模式从精通到入门一 责任链模式

    ​ 一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了.于是有了想要记录下设计模式的笔记.打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一 ...

  10. 设计模式学习总结(十)责任链模式(Chain Of Responsibility)

    责任链主要指通过一连串的操作来实现某项功能或者在处理相关的业务时,对于自己的业务则进行处理,反之,对于不属于自己的业务,则进行下发!   一.示例展示: 以下例子主要通过对煤矿对井下警告信息的处理来进 ...

随机推荐

  1. HDU6442(二项式)

    要点 懒得打公式了,题解 把题目要求的复杂公式化简成熟悉的东西,一是看穿前面加个\(n!\)化为\(C_n^i,i为奇数\):二是将奇数的条件去掉的数学技巧. 形为\({(a + b\sqrt{B}) ...

  2. Codeforces Round 56-B. Letters Rearranging(思维)

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  3. Ubuntu上源码安装golang并设置开发环境

    安装go #wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz #tar -xzf go1.10.3.linux-amd64.tar.g ...

  4. [转]eclipse启动tomcat无法访问的解决方法

    这篇文章介绍了eclipse启动tomcat无法访问的解决方法,有需要的朋友可以参考一下 症状: tomcat在eclipse里面能正常启动,而在浏览器中访问http://localhost:8080 ...

  5. return void ajax

    public class UserInfo { private String name; private Integer age; public String getName() { return n ...

  6. webpack相关插件

    webpack-merge:开发环境和生产环节的webpaak配置文件的配置合并 file-loader:编译写入文件,默认情况下生成文件的文件名是文件名与MD5哈希值的组合 vue-laoder:编 ...

  7. 洛谷 P1203 [USACO1.1]坏掉的项链Broken Necklace

    坏掉的项链Broken Necklace 难度:★ Code: #include <iostream> #include <cstdio> #include <cstri ...

  8. 织梦dedecms后台登陆密码充值工具

    下载后解压,根据自己语言版本,把文件radminpass.php放入网站根目录下执行即可 点击下载:织梦dedecms后台登陆密码充值工具

  9. 使用java来压缩图片

    使用java来压缩图片,简单几句,清清爽爽 使用0.3的压缩比得到的结果如下(从2.8M压缩到268K,且图片的清晰度看不出明显差别): package carlspringtest; import ...

  10. uvm_reg_map——寄存器模型(八)

    所有的寄存器都需要地址,都需要加入到地址列表中 //-------------------------------------------------------------------------- ...