23个java设计模式(六)-- 责任链模式

2016年03月14日 原创
关键词: java 设计模式
摘要 责任链模式就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

一、概述。

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

责任链模式的关键是将用户的请求分派给许多对象,这些对象被组织成一个责任链,即每个对象含有后继对象的引用,并要求责任链上的每个对象如果能处理用户的请求就作出处理,不再将用户的请求传递给责任链上的下一个对象;如果不能处理用户的请求,就必须将用户的请求传递给责任链上的下一个对象。

二、责任链模式的结构。

责任链模式的结构中包括两种角色。

  • 处理者(Handler):处理者是一个接口,负责规定具体处理者处理用户请求的方法以及具体处理者设置后继对象的方法。
  • 具体处理者(ConcreteHandler):具体处理者是实现处理者接口的类的实例。具体处理者通过调用处理者接口规定的方法处理用户的请求,即在接到用户的请求后,处理者将调用接口规定的方法,在执行该方法的过程中,如果发现能处理用户的请求,就处理有关数据,否则就反馈无法处理的信息给客户,然后将用户的请求传递给自己的后继对象。

注:由于Java不支持多重继承,因此在Java中,处理者最好不是一个抽象类,否则创建具体抽象者的类无法继承其他类,限制了具体处理者的能力。

三、实例程序。

处理者(Handler)

public interface Handler {
	public abstract void handleRequest(String number);
	public abstract void setNextHandler(Handler handler);
}

具体处理者

public class Beijing implements Handler{
	private Handler handler;
	private ArrayList<String> numberList;
	
	public Beijing() {
		super();
		numberList = new ArrayList<>();
		numberList.add("11158498115989189");
		numberList.add("89744981891198198");
		numberList.add("78456498112318415");
		numberList.add("31654981198980981");
	}

	@Override
	public void handleRequest(String number) {
		if(numberList.contains(number)) {
			System.out.println("该人在北京居住");
		} else {
			System.out.println("该人不在北京居住");
			if(handler!=null) {
				handler.handleRequest(number);
			}
		}
	}

	@Override
	public void setNextHandler(Handler handler) {
		this.handler = handler;
	}

}


public class ShangHai implements Handler{
	private ArrayList<String> numberList;
	private Handler handler;
	
	public ShangHai() {
		super();
		numberList = new ArrayList<>();
		numberList.add("45648979484984984984");
		numberList.add("54898711897123891103");
		numberList.add("11321328546516515616");
		numberList.add("17899841698156198411");
	}

	@Override
	public void handleRequest(String number) {
		if(numberList.contains(number)) System.out.println("该人在上海居住");
		else {
			System.out.println("该人不在上海居住");
			if(handler!=null) 
				handler.handleRequest(number);
		}
	}

	@Override
	public void setNextHandler(Handler handler) {
		this.handler = handler;
	}

}



public class Tianjin implements Handler{
	private Handler handler;
	private ArrayList<String> numberList;
	
	public Tianjin() {
		super();
		numberList = new ArrayList<>();
		numberList.add("12345698189411098");
		numberList.add("21564981894984189");
		numberList.add("35618908919981985");
		numberList.add("78949498984981231");
	}

	@Override
	public void handleRequest(String number) {
		if(numberList.contains(number))System.out.println("该人在天津居住");
		else {
			System.out.println("该人不在天津居住");
			if(handler!=null) 
				handler.handleRequest(number);
		}
	}

	@Override
	public void setNextHandler(Handler handler) {
		this.handler = handler;
	}
	
}

测试程序

public class Example1Test {
	private Handler beijing,tianjin,shanghai;
	@Test
	public void testMain() {
		tianjin = new Tianjin();
		beijing = new Beijing();
		shanghai = new ShangHai();
		beijing.setNextHandler(tianjin);
		tianjin.setNextHandler(shanghai);
		System.out.println("第一个人:");
		beijing.handleRequest("11158498115989189");
		System.out.println("第二个人:");
		beijing.handleRequest("45648979484984984984");
		System.out.println("第三个人:");
		beijing.handleRequest("78949498984981231");
	}
	
}

四、责任链模式的优点。

  1. 责任链中的对象只和自己的后继是低耦合关系,和其他对象毫无关联,这使得编写处理者对象以及创建责任链变得非常容易。
  2. 当在处理者中分配职责时,责任链给应用程序更多的灵活性。
  3. 应用程序可以动态地增加、删除处理者或重新指派处理者的职责。
  4. 应用程序可以动态地改变处理者之间的先后顺序。
  5. 使用责任链的用户不必知道处理者的信息,用户不会知道到底是哪个对象处理了他的请求。

五、适合使用责任链模式的情景。

  1. 有许多对象可以处理用户的请求,希望程序在运行期间自动确定处理用户的那个对象。
  2. 希望用户不必明确指定接受者的情况下,向多个接受者的一个提交请求。
  3. 程序希望动态制定可处理用户请求的对象集合。