在责任链模式中,由每个对象及其下一个对象的引用连接形成一条责任链。客户端发出的请求将在这个链上进行传递。在这个过程中,每个对象可选择处理该事件,或放弃并交由下一级处理,直至处理完毕返回结果。
示例
1.handler父类,定义处理方法
CostHandler1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
   | package org.mamba.handler;
 
 
 
 
  public abstract  class CostHandler {
  	 	protected CostHandler handler;
  	
 
 
 
  	public abstract void handleRequest(float money); 	 	public void setHandler(CostHandler handler) { 		this.handler = handler; 	} 	
  	 }
   | 
 
2.实际处理类(责任链的组成部分)
StuffHandler1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   | package org.mamba.handler;
 
 
 
 
 
 
  public class StaffHandler extends CostHandler {
  	@Override 	public void handleRequest(float money) { 		if (money <= 1000) { 			System.out.println(money+"申请成功" + this.getClass().getName() + "已处理"); 		} else { 			handler.handleRequest(money); 		}
  	}
  }
 
   | 
 
LeaderHandler1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   | package org.mamba.handler;
 
 
 
 
 
  public class LeaderHandler extends CostHandler {
  	@Override 	public void handleRequest(float money) { 		if (money <= 5000) { 			System.out.println(money+"申请成功" + this.getClass().getName() + "已处理"); 		} else { 			handler.handleRequest(money); 		} 		 	}
  }
 
 
   | 
 
BossHandler1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   | package org.mamba.handler;
 
 
 
 
 
  public class BossHandler extends CostHandler{
  	@Override 	public void handleRequest(float money) { 		if (money <= 100000) { 			System.out.println(money+"申请成功" + this.getClass().getName() + "已处理"); 		} else { 			System.out.println("拒绝申请!"+ this.getClass().getName() + "已处理"); 		} 		 	}
  }
 
 
   | 
 
3.责任链创建工厂,创建责任链并返回责任链的入口对象
CostHandlerFactory1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
   | package org.mamba.factory;
  import org.mamba.handler.BossHandler; import org.mamba.handler.CostHandler; import org.mamba.handler.LeaderHandler; import org.mamba.handler.StaffHandler;
 
 
 
 
 
 
  public class CostHandlerFactory { 	
 
 
  	public static CostHandler createHanlerChain() { 		CostHandler stuff = new StaffHandler(); 		CostHandler leader = new LeaderHandler(); 		CostHandler boss = new BossHandler(); 		stuff.setHandler(leader); 		leader.setHandler(boss); 		return stuff; 	} }
 
   | 
 
4.请求的对象
ClientRequest1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | package org.mamba.client;
  import org.mamba.factory.CostHandlerFactory; import org.mamba.handler.CostHandler;
 
 
 
 
 
  public class ClientRequest { 	public static void main(String[] args) { 		CostHandler handler = CostHandlerFactory.createHanlerChain(); 		handler.handleRequest(500); 		handler.handleRequest(5000); 		handler.handleRequest(10000); 		handler.handleRequest(1000000);
  	} }
 
   | 
 
输出结果
结果 lang;java1 2 3 4
   | "500.0申请成功org.mamba.handler.StaffHandler已处理" "5000.0申请成功org.mamba.handler.LeaderHandler已处理" "10000.0申请成功org.mamba.handler.BossHandler已处理" "拒绝申请!org.mamba.handler.BossHandler已处理"
   | 
 
责任链模式的优点:对客户端来说,无需知道是谁处理了它的请求,在结构发生改变的时候,只需要将新的对象加入责任链即可,客户端不用改变依然可以得到返回值。
责任链模式的缺点:由于有多个对象存在这个链中,但多数时候并非所有对象都会被使用,相较于把问题直接提交给对应的对象处理,这样的模式速度更慢。
纯与不纯
如上述例子所述,每个对象仅有两种选择,处理或抛出该问题,每个问题仅会被一个对象处理,则为纯责任链模式。若一个问题在责任链中可以被多个对象处理,则称为不纯的责任链模式。