职责链模式(Chain Of Responsibility Pattern)

职责链模式(Chain Of Responsibility Pattern):属于对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。


职责链模式UML图


职责链模式涉及的角色

抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
具体处理者(ConcreteHandler)角色:处理它所负责的请求,由于持有对下家的引用,所以可以访问它的后继者,如果可以处理该请求,就处理之,否则将该请求转发给它的后继者。


示例代码

抽象处理者 Handler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.example.chainOfResponsebilityPattern;
* 职责链模式:抽象处理者
*
* 定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。
* 这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,
* 抽象方法handleRequest()规范了子类处理请求的操作。
*
* @author pengdh
* @date: 2017-08-12 14:05
*/
public abstract class {
protected Handler successor;
* 持有对下家的引用
*/
public void setSuccessor(Handler successor) {
this.successor = successor;
}
* 请求处理
*/
protected abstract void handlerRequest(int request);
}

具体处理者类 A ConcreteHandlerA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.example.chainOfResponsebilityPattern;
* 职责链模式:具体处理者类 A
*
* 处理它所负责的请求,由于持有对下家的引用,所以可以访问它的后继者,
* 如果可以处理该请求,就处理之,否则将该请求转发给它的后继者。
*
* @author pengdh
* @date: 2017-08-12 14:10
*/
public class ConcreteHandlerA extends {
protected void handlerRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("处理 0-10 请求" 大专栏  Java设计模式(二十一):职责链模式);
} else {
successor.handlerRequest(request); // 转移到后继者类处理
}
}
}

具体处理者类 B ConcreteHandlerB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.example.chainOfResponsebilityPattern;
* 职责链模式:具体处理者类 B
*
* 处理它所负责的请求,由于持有对下家的引用,所以可以访问它的后继者,
* 如果可以处理该请求,就处理之,否则将该请求转发给它的后继者。
*
* @author pengdh
* @date: 2017-08-12 14:17
*/
public class ConcreteHandlerB extends {
protected void handlerRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("处理 10-20 的请求");
} else {
successor.handlerRequest(request); // 转移到后继者类处理
}
}
}

客户端测试类 ChainOfResponsibilityPatternTest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.example.chainOfResponsebilityPattern;
* 职责链模式:客户端测试类
*
* @author pengdh
* @date: 2017-08-12 14:21
*/
public class ChainOfResponsibilityPatternTest {
public static void main(String[] args) {
Handler h1 = new ConcreteHandlerA();
Handler h2 = new ConcreteHandlerB();
// 持有一个对后继者的引用
h1.setSuccessor(h2);
int[] arrays = {1, 15, 3, 11};
for (int request : arrays) {
h1.handlerRequest(request);
}
}
}

职责链模式的优点

客户端提交请求后,请求是沿着链传递直到有一个具体处理者对象处理它,这样做的好处是客户端可以不用管请求由哪个对象来处理。这使得接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构,结构是职责链可以简化对象的相互连接,它们只需保持一个对后继者的引用,而不需要保持它的所有候选接收者。从而大大降低了耦合度。但是也要注意的是职责链模式的具体处理是有末端的,也就是说会有请求得不到处理的情况,所以客户端在发送请求的时候需要注意是否有对应的具体处理者不能处理的情况。


参考文献

Java设计模式(二十一):职责链模式的更多相关文章

  1. Java设计模式之《职责链模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6530089.html 职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形 ...

  2. C#设计模式之二十一职责链模式(Chain of Responsibility Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中 ...

  3. java设计模式-----18、职责链模式

    概念: Chain of Responsibility(CoR)模式也叫职责链模式.责任链模式或者职责连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的 ...

  4. JAVA设计模式之【职责链模式】

    职责链模式 专门处理请求链式传递的模式 角色 Handler抽象处理者 ConcreteHandler具体处理者 在职责链模式中,很多对象由每一个对象对其下家的引用而连接成一条链,请求在这条链上传递, ...

  5. C#设计模式之二十职责链模式(Chain of Responsibility Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中的例子吧,理解起来可能更 ...

  6. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  7. Java设计模式学习记录-责任链模式

    前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...

  8. 大话设计模式Python实现-职责链模式

    职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接收者的耦合关系.将对象连成链并沿着这条链传递请求直到被处理 下面是一个设计模式的demo: ...

  9. Java设计模式十九——责任链模式

    责任链模式 老李的苦恼 每个人在出生的时候,都早已在暗中被标好了三六九等. 老李是一名建筑工地的木匠,和大多数生活在社会最底层的农民工一样,一辈子老实本分,胆小怕事.在他们的心中,谁当老爷都没有区别, ...

  10. C#设计模式系列:职责链模式(Chain of Responsibility)

    1.职责链模式简介 1.1>.定义 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对 ...

随机推荐

  1. 使用Euclid算法求最大公约数

    参考文章 1.<linux c编程一站式学习>的习题5.3.1 2.百度百科Euclid算法:https://baike.baidu.com/item/Euclid%E7%AE%97%E6 ...

  2. dubbo使用Spring配置暴露服务和使用Spring配置引用远程服务

    提供者: <!-- 1.指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) --> <dubbo:application name="user-servic ...

  3. 配置完aop不能返回json

    遇到一个bug,配置了记录controller层的aop,后来发现是因为我aop是写在controller层(在springmvc的容器中)而开启aop配置却写在spring中,所以不起作用,需要在s ...

  4. ubuntu14.04安装32位库

    sudo dpkg --add-architecture i386 sudo apt update

  5. Python常见经典

    python中if __name__ == '__main__': 的解析 当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它 ...

  6. Java之多线程方式二(实现Runnable接口)

    /** * 创建多线程的方式二:实现Runnable接口 * 1. 创建一个实现了Runnable接口的类 * 2. 实现类去实现Runnable中的抽象方法:run() * 3. 创建实现类的对象 ...

  7. springboot+solr基本使用

    接着上一篇的搭建 首先需要的pom节点有 <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data ...

  8. js window.onload 加载多个函数和追加函数

    平时做项目 经常需要使用window.onload, 用法如下: function func(){alert("this is window onload event!");ret ...

  9. iOS雪花动画、音频图、新闻界面框架、2048游戏、二维码条形码扫码生成等源码

    iOS精选源码 粒子雪花与烟花的动画 iOS 2048游戏 JHSoundWaveView - 简单地声波图.音波图 一个可快速集成的新闻详情界面框架,类似今日头条,腾讯新闻 二维码/条形码扫描及扫描 ...

  10. Linux磁盘空间满的诡异问题解决方案

    问题描述: 今天登上一台服务器,df -h 发面根目录磁盘已经满了 解决过程: cd / du -sh *  发现并没有大文件,占用的空间没多大 根据经验,先通过lsof | grep deleted ...