责任链模式

154 阅读4分钟

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

责任链模式的角色: 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

首先声明一点,Java中广义的接口有两种,一种就是interface关键字定义的接口,另外一种就是abstract关键字定义的抽象类。

我这里举个例子来实现具体的责任链模式。 假设为村里搞建设,那么就需要上级的批准。然而村里要搞的建设是不同档次的,所以需要的批准也是不一样的。具体而言,现在要为村里建路灯那么只要上报村长,村长批准就能建路灯;如果要建设娱乐广场,这个时候上报村长,村长没有这么大的权力去批准这件事,所以村长继续上报镇长,镇长只要批准了就有路灯;同样的,村里要修路,这个时候先上报村长,村长无法决断就上报镇长,镇长无法决断就上报县长依次类推只要到达某一个等级的人能够有权利批准,批准了就能建设,没有权利就继续上报...... 当我们将每一件事情都设置一个等级的时候,每次的判断就是判断当前的人的等级时候大于等于这个等级大于就存在自己的承受范围之内自己就可以处理,否则就无法处理。

代码的实现: 首先定义抽象类:

/**
 * @author BeautifulSoup
 * 定义抽象类,用于每一个等级的都要执行的操作的抽取
 */
public abstract class Handler {
	
	protected Handler successor;
	//用于得到下一个对象的引用
	public void setSuccessor(Handler successor) {
		this.successor = successor;
	}
	
	public Handler getSuccessor() {
		return successor;
	}

	//定义方法用于真正的处理具体的业务(如果在自己的处理范围内的话),
	public abstract void handleRequest(int level);
}

定义实现类(假设共有4个级别的事):

/**
 * @author BeautifulSoup
 * 村长只能判断级别小于等于1的事
 */
public class VillageHeadHandler extends Handler {
	@Override
	public void handleRequest(int level) {
		if(level<=1){
			System.out.println("村长能够批准此事");
		}else{
			successor.handleRequest(level);//无法批准此事就交给下一级别处理
		}
	}
}

/**
 * @author BeautifulSoup
 * 镇长可以处理级别小于等于2的事
 */
public class MayorHandler extends Handler {
	@Override
	public void handleRequest(int level) {
		if(level<=2){
			System.out.println("镇长可以处理这个级别的事情");
		}else{
			successor.handleRequest(level);//镇长无法处理这个级别的事交给下一级别处理
		}
	}
}

/**
 * @author BeautifulSoup
 * 县长只能处理级别小于等于级别为3的事
 */
public class CountyMagistrateHandler extends Handler {
	@Override
	public void handleRequest(int level) {
		if(level<=3){
			System.out.println("县长可以批准这个级别的事情");
		}else{
			successor.handleRequest(level);//县长无法处理只能交给下一级别的官员
		}
	}
}

/**
 * @author BeautifulSoup
 * 省长可以决定是否批准所有的常见的事情
 */
public class GovernorHandler extends Handler {
	@Override
	public void handleRequest(int level) {
		if(level<=4){
			System.out.println("省长批准处理这个事情");
		}else{
			System.out.println("省长不批准这个事情");
		}
	}
}

创建工厂类用于实例化不同的Handler并将最小的Handler返回。

/**
 * @author BeautifulSoup
 * 创建工厂函数用于创建Handler
 */
public class HandlerFactory {
	public static Handler createHandler(){
		Handler villagehandler=new VillageHeadHandler();
		Handler mayorhandler=new MayorHandler();
		Handler countyhandler=new CountyMagistrateHandler();
		Handler governhandler=new GovernorHandler();
		
		//注意设置每一个级别的直接后继
		villagehandler.setSuccessor(mayorhandler);
		mayorhandler.setSuccessor(countyhandler);
		countyhandler.setSuccessor(governhandler);
		
		return villagehandler;//采用了自底而上的责任链模式
	}
}

客户端完成不同请求的代码:

/**
 * @author BeautifulSoup
 * 客户端只关心某个级别的事件能否被处理,却不关心是由哪个级别的人处理的
 */
public class Custom {
	private Handler handler;
	public void setHandler(Handler handler) {
		this.handler = handler;
	}
	public void customRequest(int level){
		handler.handleRequest(level);
	}
	public static void main(String[] args) {
		Custom custom=new Custom();
		custom.setHandler(HandlerFactory.createHandler());
		//进行请求
		custom.customRequest(4);
	}
}