java设计模式_责任链模式

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

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

从击鼓传花谈起

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

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

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

责任链模式的结构

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

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

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

  ●  具体处理者(ConcreteHandler)角色:具体处理者接到请求后,能够选择将请求处理掉,或者将请求传给下家。因为具体处理者持有对下家的引用,所以,若是须要,具体处理者能够访问下家。blog

抽象处理者角色:接口

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
		
	}
}
相关文章
相关标签/搜索