使多个对象有机会出来请求,从而避免请求者和请求处理者之间的耦合,将这些处理请求的对象链成一个串,将请求一直往下抛,直到有处理者处理请求。
纯责任链模式:
每一个处理请求对象,要么完全不处理请求直接往下抛,要处理完整的请求并返回。
复杂责任链模式:
每一个请求者对象可以处理请求的一部分,然后再向下抛出,直到有处理者处理完毕。
一、使用场景
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); } } }