文档章节

java设计模式_责任链模式

王大叔爱编程
 王大叔爱编程
发布于 2013/11/18 17:30
字数 825
阅读 158
收藏 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
		
	}
}

© 著作权归作者所有

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

王大叔爱编程

粉丝 34
博文 111
码字总数 61053
作品 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
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
2018/10/10
0
0
java 23种设计模式 深入理解

以下是学习过程中查询的资料,别人总结的资料,比较容易理解(站在各位巨人的肩膀上,望博主勿究) 创建型 抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html ...

wc_飞豆
2018/03/16
0
0
练就Java24章真经—你所不知道的工厂方法

前言 最近一直在Java方向奋斗《终于,我还是下决心学Java后台了》,今天抽空开始学习Java的设计模式了 。计划有时间就去学习,你这么有时间,还不来一起上车吗? 之所以要学习Java模式,是因...

codeGoogle
2018/10/30
0
0
PHP设计模式(一):简介及创建型模式

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

juhenj
2014/05/15
228
2

没有更多内容

加载失败,请刷新页面

加载更多

《傲慢与偏见》的读书笔记与读后感作文2400字

《傲慢与偏见》的读书笔记与读后感作文2400字: 作者:孙苑馨;笔者按:读书这个习惯是我爸妈养出来的。小时候父母赚的钱除了吃饭穿衣剩下的就是买书了,他们除了买各种新鲜出版的文艺派图书...

原创小博客
8分钟前
0
0
oozie job 的挂了监控报警或重启

oozie Coordinator 的job 和actioni状态很多,但好像不支持设置某状态如failed后30分钟后自动重新拉启,因他的条件只有几种:触发条件可以是一个时间频率、一个dataset实例是否可用,或者可能...

hblt-j
27分钟前
1
0
python精简笔记-[6]-条件判断[if]语句

语法: if 判断条件: 执行语句……elif 判断条件:    执行语句……elif 判断条件:    执行语句……else: 执行语句…… 实例1: n = input("请输入您的性别: "...

平头哥-Enjoystudy
30分钟前
0
0
RxJava 是如何实现线程切换的(上)

前言 通过前一篇的从观察者模式出发,聊聊RxJava,我们大致理解了RxJava的实现原理,在RxJava中可以非常方便的实现不同线程间的切换。subscribeOn 用于指定上游线程,observeOn 用于指定下游线...

亭子happy
57分钟前
2
0
想晋级高级工程师只知道表面是不够的!Git内部原理介绍

本文由云+社区发表 作者:腾讯工蜂用户:王二卫 从不一样的视角了解git,以便更好的使用git 一、git & git 版本库认识 git 是一个内容寻址的文件系统,其核心部分是一个简单的键值对数据库(...

腾讯云加社区
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部