文档章节

设计模式----职责链模式UML和实现代码

a
 amosli
发布于 2015/12/13 23:35
字数 1138
阅读 56
收藏 0

一、什么是职责链模式?

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

类型:形为型模式 

顺口溜:中访策备迭 模命状

职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。

链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。

二、职责链模式UML

三、JAVA代码实现

package com.amosli.dp.behavior.cor;

public abstract class Handler {
	protected Handler handler;

	public void setSuccessor(Handler handler) {
		this.handler = handler;
	}

	public abstract void handleRequest(int request);
}

package com.amosli.dp.behavior.cor;

public class ConcreteHandler1 extends Handler {

	@Override
	public void handleRequest(int request) {
		if (request < 0) {
			System.out.println("request is null");
		} else if (handler != null) {
			handler.handleRequest(request);
		}
	}

}

package com.amosli.dp.behavior.cor;

public class ConcreteHandler2 extends Handler {

	@Override
	public void handleRequest(int request) {
		if (request >= 0 && request < 10) {
			System.out.println("so,0<=request<10");
		} else if (handler != null) {
			handler.handleRequest(request);
		}
	}
}

package com.amosli.dp.behavior.cor;

public class ConcreteHandler3 extends Handler {

	@Override
	public void handleRequest(int request) {
		if (request>=10) {
			System.out.println("so,request>=10");
		} else if (handler != null) {
			handler.handleRequest(request);
		}
	}
}

package com.amosli.dp.behavior.cor;

public class Client {
	public static void main(String[] args) {
		ConcreteHandler1 h1 = new ConcreteHandler1();
		ConcreteHandler2 h2 = new ConcreteHandler2();
		ConcreteHandler3 h3 = new ConcreteHandler3();
		
		h1.setSuccessor(h2);
		h2.setSuccessor(h3);
		h1.handleRequest(20);
	}
}

四、使用场景

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

  • 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

  • 可动态指定一组对象处理请求。

五、优缺点

1、优点

1 ) 降低耦合度 :该模式使得一个对象无需知道是其他哪一个对象处理其请求。对象仅需知道该请求会被“正确”地处理。接收者和发送者都没有对方的明确的信息,且链中的对象不需知道链的结构。

2) 职责链可简化对象的相互连接 :    结果是,职责链可简化对象的相互连接。它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。

3) 增强了给对象指派职责( R e s p o n s i b i l i t y )的灵活性 :当在对象中分派职责时,职责链给你更多的灵活性。你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。你可以将这种机制与静态的特例化处理对象的继承机制结合起来使用。

4)增加新的请求处理类很方便

2、缺点

1)  不能保证请求一定被接收。既然一个请求没有明确的接收者,那么就不能保证它一定会被处理 —该请求可能一直到链的末端都得不到处理。一个请求也可能因该链没有被正确配置而得不到处理。

2)  系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。

3)当这个链结构比较长,比较复杂的话,会产生很多的内存垃圾对象。

六、源码地址

本系列文章源码地址,https://github.com/amosli/dp  欢迎Fork  & Star !!



© 著作权归作者所有

a
粉丝 5
博文 25
码字总数 18138
作品 0
黄浦
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
296
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
08/20
0
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
【前端进阶之路】没有入门设计模式?那看这篇就够了!

1、前言 每个设计模式我都用一个很简单的例子来让大家去理解 毕竟深入设计模式还需要在实际写代码、优化代码的过程中去神话理解(即需要自己遇到该用的场景) 并不会列举所有的设计模式,比如...

lio-mengxiang
07/16
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
286
2

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
8
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部