文档章节

java设计模式_责任链模式

王大叔爱编程
 王大叔爱编程
发布于 2013/11/18 17:30
字数 825
阅读 155
收藏 0
点赞 0
评论 0

参考来自:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html

责任链是对象的一种行为模式,在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上,直到某个对象决定处理此请求。发出这个请求的客户端并不知道是链上的哪一个对象处理此请求,系统在不影响客户端的情况下动态的重新组织和分配责任。

从击鼓传花谈起

  击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。

  比如说,贾母、贾赦、贾政、贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链。击鼓者将花传给贾母,开始传花游戏。花由贾母传给 贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又贾宝玉传给贾环,由贾环传回给贾母,如此往复,如下图所示。当鼓声停止时,手中有花的人就得执行酒令。

  击鼓传花便是责任链模式的应用。责任链可能是一条直线、一个环链或者一个树结构的一部分。

责任链模式的结构

  下面使用了一个责任链模式的最简单的实现。

  责任链模式涉及到的角色如下所示:

  ●  抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的 引用,抽象方法handleRequest()规范了子类处理请求的操作。

  ●  具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

抽象处理者角色:

package com.wangbiao.responsibilities;

public abstract class HolidayHandler {

	protected HolidayHandler handler=null;
	
	public void setProcessor(HolidayHandler handler){
		this.handler=handler;
	}
	
	public HolidayHandler getProcessor(){
		return handler;
	}
	public abstract void handlerRequest(int days);
}

具体处理者角色:

TeamLeaderHandler,ProjectManagerHandler,GeneralManager

package com.wangbiao.responsibilities;

public class TeamLeaderHandler extends HolidayHandler {

	@Override
	public void handlerRequest(int days) {
		//Team Leader days<=1
		if(days<=1){
			System.out.println("TeamLeaderHandler Approve");
		}else if(null!=getProcessor()){
			getProcessor().handlerRequest(days);
		}
	}
}

package com.wangbiao.responsibilities;

public class ProjectManagerHandler extends HolidayHandler {

	@Override
	public void handlerRequest(int days) {
		if(days>=2 && days<=5){
			System.out.println("ProjectManagerHandler Approve");
		}else if(null!=getProcessor()){
			getProcessor().handlerRequest(days);
		}

	}
}

package com.wangbiao.responsibilities;

public class GeneralManager extends HolidayHandler {

	@Override
	public void handlerRequest(int days) {
		if(days>5){
			System.out.println("GeneralManager Approve");
		}else if(null!=getProcessor()){
			getProcessor().handlerRequest(days);
		}
	}

}

package com.wangbiao.responsibilities;

/**
 * Team Leader可以审批1天的假期,Project Manager可以审批2-5天的假期,General Manager可以审批5天以上的假期。
 * @author WangBiao
 *
 */
public class ResponsibilitesChain {

	
	public static void main(String[] args) {
		HolidayHandler tl=new TeamLeaderHandler();
		HolidayHandler pm=new ProjectManagerHandler();
		HolidayHandler gm=new GeneralManager();
		
		tl.setProcessor(pm);
		pm.setProcessor(gm);
		
		//begin ask for leave
		tl.handlerRequest(1);
		tl.handlerRequest(2);
		tl.handlerRequest(7);
		//result
		//TeamLeaderHandler Approve
		//ProjectManagerHandler Approve
		//GeneralManager Approve
		
	}
}

© 著作权归作者所有

共有 人打赏支持
王大叔爱编程

王大叔爱编程

粉丝 32
博文 113
码字总数 63525
作品 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
0
0
20个设计模式和软件设计面试问题

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎...

LCZ777
2014/08/13
0
0
java开发中的常用的设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

qq_38024548
05/28
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
设计模式19——Command设计模式

Command命令设计模式将一个请求封装成一个对象,从而使你可用不同的请求对客户进行操作。Command命令设计模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的...

小米米儿小
2014/01/27
0
0
java中23种设计模式(上)

参考网址:http://blog.csdn.net/zhangerqing 资源:http://download.csdn.net/detail/zhangerqing/4835830 设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用、多数...

青涩的梦
06/26
0
0
Java之美[从菜鸟到高手演变]之设计模式

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

只想一个人静一静
2014/02/25
0
2
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
05/08
0
0
Java开发中的23种设计模式详解

设计模式(Design Patterns) ——可复用面向对象软件的基础 设 计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代...

java-苦苦甜甜
2014/04/21
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊ribbon的超时时间设置

序 本文主要研究一下ribbon的超时时间设置 配置 实例 ribbon: ReadTimeout: 10000 ConnectTimeout: 10000 MaxAutoRetries: 0 MaxAutoRetriesNextServer: 1 eureka: enabled: ......

go4it
10分钟前
0
0
一行代码结果叹为观止,能做到这么极致的也只有python了

Python 这门语言非常的有趣,不仅可以做高大上的人工智能、大数据、机器学习。还可以用来做 Web、爬虫。还有其它很多的应用。今天我就给大家展示下一行 Python 代码都可以做些什么。 一行打印...

猫咪编程
13分钟前
0
0
KingShard使用

对于kingshard的功能,在git中可以看到明确的功能说明 主要功能: 1. 基础功能 支持SQL读写分离。 支持透明的MySQL连接池,不必每次新建连接。 支持平滑上线DB或下线DB,前端应用无感知。 支...

mickelfeng
15分钟前
0
0
Linux 下 查找某个字符串

如果你想在当前项目下 查找 "test" 这个字符串,可以这样: grep -rn "test" * * : 表示当前目录所有文件,也可以是某个文件名-r 是递归查找-n 是显示行号-R ...

nsns
15分钟前
0
0
数据结构 之 B树与红黑树

https://blog.csdn.net/v_july_v/article/details/6530142 http://www.cnblogs.com/CarpenterLee/p/5503882.html...

晨猫
15分钟前
0
0
Linux查看服务器总内存和总硬盘大小

一、linux CPU大小; 其实应该通过Physical Processor ID来区分单核和双核。而Physical Processor ID可以从cpuinfo或者dmesg中找到. flags 如果有 ht 说明支持超线程技术 判断物理CPU的个数可...

浮躁的码农
15分钟前
0
0
Postfix命令行说明

Postfix tips and Troubleshooting Commands Here's a list of stuff I user everyday and other email admins will also be using, Let me know if I missed anything List/Print current m......

mingle
22分钟前
0
0
是时候使用Helm了:Helm, Kubernetes的包管理工具

目前我们的一个产品共有4套环境:dev环境、test环境、staging环境、production环境。 其中dev, test, staging环境在一个Kubernetes集群上以不同namespace部署,production环境部署在另一个Kub...

xiaomin0322
29分钟前
0
0
常见的redis的序列化方式

概括 一般redis的序列化方式主要有:字符串序列化、json序列化、xml序列化、jdk序列化,具体可查阅org.springframework.data.redis.serializer.RedisSerializer 的实现类,其中对于json序列化...

菜蚜
44分钟前
1
0
Linux bash入门

一、Linux Bash介绍 Bash是UNIX系统下的一个命令解析器,全称为Bourne-Again Shell是一个为GNU开源项目编写的Unix shell。bash功能强大,尤其是在处理自动循环或者耗时大的任务方面可以节省大...

老韭菜
47分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部