[设计模式]之五:职责链模式

定义

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

场景

需要层层审批的,直到某一层可以给出具体结果。 比如离职申请,首先发给团队主管,然后团队主管发给部门经理,之后再给总经理这样,一层一层上传,直到信息传给能够给出反馈的人。

UML

示例代码

//统一处理接口
abstract class Handler {
	protected Handler handler;
	
	public void setHandler(Handler handler) {
		this.handler =  handler;
	}
	
	public abstract void HandlerRequest(int req);
}
//具体实现 处理不同的内容
public class ConcreteHandler1 extends Handler {

	@Override
	public void HandlerRequest(int req) {
		// TODO Auto-generated method stub
		if (req >= 0 && req < 10) {
			System.out.println("Handler1 handle " + req + " now");
		} else if (handler != null) {
			handler.HandlerRequest(req);
		}
	}

}
public class ConcreteHandler2 extends Handler {

	@Override
	public void HandlerRequest(int req) {
		// TODO Auto-generated method stub
		if (req >= 10 && req < 20) {
			System.out.println("Handler2 handle " + req + " now");
		} else if (handler != null) {
			handler.HandlerRequest(req);
		}
	}

}
public class ConcreteHandler3 extends Handler {

	@Override
	public void HandlerRequest(int req) {
		// TODO Auto-generated method stub
		if (req >= 20 && req < 30) {
			System.out.println("Handler3 handle " + req + " now");
		} else if (handler != null) {
			handler.HandlerRequest(req);
		}
	}

}
//客户代码
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Handler h1 = new ConcreteHandler1();
		Handler h2 = new ConcreteHandler2();
		Handler h3 = new ConcreteHandler3();
		
		h1.setHandler(h2);
		h2.setHandler(h3);
		
		List<Integer> list = new ArrayList<Integer>();
		list.add(2);
		list.add(5);
		list.add(14);
		list.add(22);
		list.add(18);
		list.add(3);
		list.add(27);
		list.add(20);
		
		for(Integer i : list) {
			h1.HandlerRequest(i);
		}
	}
//输出
Handler1 handle 2 now
Handler1 handle 5 now
Handler2 handle 14 now
Handler3 handle 22 now
Handler2 handle 18 now
Handler1 handle 3 now
Handler3 handle 27 now
Handler3 handle 20 now

评价

一个很好的优点是,当客户提交一个请求时,请求是按着链传递,直至有一个ConcreteHandler对象负责处理。也就是请求一定会被处理。

另外降低了耦合度。因为这个结构,接收者和发送者都不清楚对方的明确信息,且链中对象也不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用。

最后,可以随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码匠的流水账

分布式id生成方案概述

对于每个标识,都需要有一个命名空间(namespace),来保证其相对唯一性。 分布式的ID生成,以Twitter Snowflake为代表的, Flake 系...

1282
来自专栏数据和云

中文命名可能有什么坏处?

在最近的一个报告分析中,再次遭遇到全中文的数据结构设计。从图示中可以看到,所有的表名、索引名等,都是用中文命名的。 我们不考虑面向对象、方法那回事,单纯从技术角...

3705
来自专栏灯塔大数据

干货 | Python 性能优化的20条招数

使用python时,你是不是需要性能优化?今天灯塔给你带来python性能优化的20条招数,记得收藏哟!

1882
来自专栏JackeyGao的博客

Python 和 Golang 一点愚见

Python 之所以有很好开发效率是因为语法简单,灵活。有大量的轮子可供选择, 文档支持非常棒。 我用Python编程的时候,基本成了一把梭“拿起键盘复制粘贴,...

1192
来自专栏安恒网络空间安全讲武堂

技术分享 | 谈一谈CTF中的python沙箱逃逸

0x01 前言 笔者在最近的CTF比赛中遇到了几次关于python沙箱逃逸的web题目,故此做一些总结。在阅读这篇文章之前,我相信你已经了解关于python的一...

5849
来自专栏牛客网

考点总结:互联网校招技术岗都考些什么?数据结构算法游戏 + 场景c++面向对象javaJVMSpringandroid数据库计网线程安全linux前端询问面试官

数据结构 红黑树 pk 平衡二叉树 hash表处理冲突的方法 算法 手写 最长无重复字符子串 链表的增、删、查、逆序 数组实现队列,要求可以动态扩展,保证较高的...

3407
来自专栏xingoo, 一个梦想做发明家的程序员

Elasticsearch聚合初探——metric篇

Elasticsearch是一款提供检索以及相关度排序的开源框架,同时,也支持对存储的文档进行复杂的统计——聚合。 前言 ES中的聚合被分为两大类:Met...

23110
来自专栏牛肉圆粉不加葱

Spark 内存管理的前世今生(下)

在《Spark 内存管理的前世今生(上)》中,我们介绍了 UnifiedMemoryManager 是如何管理内存的。然而,UnifiedMemoryManag...

1022
来自专栏Ldpe2G的个人博客

ScalaMP ---- 模仿 OpenMp 的一个简单并行计算框架

这个项目是一次课程作业,要求是写一个并行计算框架,本人本身对openmp比较熟,

2086
来自专栏数说工作室

【SAS Says】基础篇:7. SAS宏初步

宏用来处理重复工作最好,比如你需要跑10个回归,用proc reg...,这10个回归其他都一样,就是因变量y每次需要换。那么将回归程序写成一个宏,每次用的时候...

3846

扫码关注云+社区