职责链模式

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


 1.当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。


 2.接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简
   化对象的相互连接,它们仅需保持一个指向其后续者的引用,而不需保持它所有的候选接受者的引用。


 3.可随时地增加或修改处理一个请求的结构。增加了给对象指派职责的灵活性。


 4.需事先考虑全面,一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。

 

职责链模式_第1张图片

/**
 * Handler类,定义一个处理请求的接口
 */
public abstract class Handler {
	
	protected Handler successor;
	
	// 设置继任者
	public void setSuccessor(Handler successor){
		this.successor = successor;
	}
	
	// 处理请求的抽象方法
	public abstract void handleRequest(int request);

}

 

/**
 * 具体处理者类:当请求数在0到10之间则有权处理,否则转到下一位。
 */
public class ConcreteHandler1 extends Handler{

	@Override
	public void handleRequest(int request) {
		
		if(request>=0 && request<10){			
			System.out.println("ConcreteHandler1 处理请求数"+request );
		}else if(successor!=null){			
			// 转到下一位
			successor.handleRequest(request);
		}
	}
}

 

/**
 * 具体处理者类:当请求数在10到20之间则有权处理,否则转到下一位。
 */
public class ConcreteHandler2 extends Handler{

	@Override
	public void handleRequest(int request) {
		
		if(request>=10 && request<20){
			System.out.println("ConcreteHandler2 处理请求数"+request );
		}else if(successor!=null){
			// 转到下一位
			successor.handleRequest(request);
		}
	}
}

 

/**
 * 具体处理者类:当请求数在20到30之间则有权处理,否则转到下一位。
 */
public class ConcreteHandler3 extends Handler{

	@Override
	public void handleRequest(int request) {
		
		if(request>=20 && request<30){
			System.out.println("ConcreteHandler3 处理请求数"+request );
		}else if(successor!=null){
			// 转到下一位
			successor.handleRequest(request);
		}
	}

}

 

	public static void main(String[] args) {
		
		Handler handler1 = new ConcreteHandler1();
		Handler handler2 = new ConcreteHandler2();
		Handler handler3 = new ConcreteHandler3();
		
		// 设置职责链上家与下家
		handler1.setSuccessor(handler2);
		handler2.setSuccessor(handler3);
		
		int[] request = {2,5,14,22,18,3,27,20};
		for(int i : request){
			// 循环给最小处理者提交请求,不同的数额,由不同权限处理者处理
			handler1.handleRequest(i);
		}

	}

 

运行结果如下:

ConcreteHandler1 处理请求数2
ConcreteHandler1 处理请求数5
ConcreteHandler2 处理请求数14
ConcreteHandler3 处理请求数22
ConcreteHandler2 处理请求数18
ConcreteHandler1 处理请求数3
ConcreteHandler3 处理请求数27
ConcreteHandler3 处理请求数20

 

你可能感兴趣的:(职责链模式)