责任链模式(Chain of Responsibility Method)

使多个对象有机会出来请求,从而避免请求者和请求处理者之间的耦合,将这些处理请求的对象链成一个串,将请求一直往下抛,直到有处理者处理请求。

纯责任链模式:

    每一个处理请求对象,要么完全不处理请求直接往下抛,要处理完整的请求并返回。

复杂责任链模式:

    每一个请求者对象可以处理请求的一部分,然后再向下抛出,直到有处理者处理完毕。

一、使用场景

1、有多个对象可以处理同一个请求,具体哪个对象处理该请求需要等到运行时刻再确定。
2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求,还可以改变链中处理者之间的先后次序。 

 

缺点:

1、在处理者总多的情况下比较耗时。

2、不能保证每一个请求都被处理。

 

例:

 

package responsibility;


/**
 *create by datao.wang 2014-2-11-下午5:03:32	
 *抽象处理者
 */
public abstract class Handler {
    //处理方法  可以添加处理的请求对象作为参数
	public abstract void handler(HandlerChain chain);

}


package responsibility;

import java.util.ArrayList;
import java.util.List;

/**
 *create by datao.wang 2014-2-11-下午6:52:34	
 *请求处理者管理链
 */
public class HandlerChain extends Handler {

	//下一个请求处理者
	protected List<Handler> handler=new ArrayList<Handler>();
	int index=0;
	
	@Override
	public void handler(HandlerChain chain) {
		if(index==handler.size())
			return;//循环完了退出
		
		if(handler.size()!=0){//循环处理请求
			Handler h=handler.get(index++);
			h.handler(chain);
		}
	}

	public HandlerChain addHandler(Handler h){
		handler.add(h);
		return this;
	}
}



package responsibility;
/**
 *create by datao.wang 2014-2-11-下午5:08:24	
 *具体请求处理者1
 */
public class Handler1 extends Handler {

	@Override
	public void handler(HandlerChain chain) {
		if("xxx".equals("如果请求该handler1处理,否则把责任往下传递")){
			System.out.println("handler1 处理......");
		}else {
			System.out.println("handler1-----抛出");
			chain.handler(chain);
		}
	}

}

package responsibility;
/**
 *create by datao.wang 2014-2-11-下午5:08:24	
 *具体请求处理者2
 */
public class Handler2 extends Handler {

	@Override
	public void handler(HandlerChain chain) {
		if("xxx".equals("如果请求该handler2处理,否则把责任往下传递")){
			System.out.println("handler2 处理......");
		}else {
			System.out.println("handler2-----抛出");
			chain.handler(chain);
		}
	}

}

package responsibility;
/**
 *create by datao.wang 2014-2-11-下午5:08:24	
 *具体请求处理者3
 */
public class Handler3 extends Handler {

	@Override
	public void handler(HandlerChain chain) {
		if("xxx".equals("如果请求该handler3处理,否则把责任往下传递")){
			System.out.println("handler3 处理......");
		}else {
			System.out.println("handler3-----抛出");
			chain.handler(chain);
		}
	}

}

 

猜你喜欢

转载自wdt1988520.iteye.com/blog/2015113
今日推荐