职责链模式(chain of responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止(有点想链表结构 每个对象和下一个对象相关联)
 1、链表方式:比如请假审批(要一级一级的审批)
2、非链表方式:通过集合,数组生成责任链更加实用,将链表上的各个对象都添加到集合中,然后通过反射给构建出来。
然后在容器里一个个的处理。(也就是说把测试代码中除了请假的其他代码都给用一个类来处理)
1、Java的异常机制就是一个责任链模式,一个try可以对应多个catch。如果某一个catch不匹配,则跳到下一个catch中
2、JavaScript语言中的事件的冒泡和捕获机制
3、Servlet开发中,过滤器的链式处理(doFilter())
4、Struts2中,拦截器的调用也是典型的责任链模式
 责任链的好处:
1、接受者和发送者都没有对方的明确信息,且链中的对象也并不知道链的结构,结果是责任链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选继承者,大大的降低了耦合度。
请求者不用管具体哪个对象会处理,反正该请求肯定会被处理就行了
2、可以随时增加或者修改处理一个请求的结构,增加了给对象指派职责的灵活性
  
public static void main(String[] args) {
  
         //构建各个领导人
         Leader a = new Director("张三");//主任
         Leader b = new Manager("李四");//经理
         Leader c = new GeneralManager("王五");//总经理
         //设置各个责任链上的关系
        a.setNextLeader(b);//主任的下一个审批人为经理
         b.setNextLeader(c);//经理的下一个审批人为总经理
           
         //开始请假
         LeaveRequest request = new LeaveRequest("小明", 3, "旅游");
         a.handleRequest(request);//小明提交了请假申请给主任
     }
/**
  * 抽象类:管理责任链上的对象处理的抽象类
  * @author guk
  *
  */
 public abstract class Leader {
  
     protected String name;
     protected Leader nextLeader;//下一个继承者
     public Leader(String name) {
  
         super();
         this.name = name;
     }
     // 设置责任链上的下一个继承者
     public void setNextLeader(Leader nextLeader) {
  
         this.nextLeader = nextLeader;
     }
     //处理请求的抽象方法
     public abstract void handleRequest(LeaveRequest leavePeople);
     
 }
/**
  * 主任类
  * @author guk
  *
  */
 public class Director extends Leader {
  
     
     public Director(String name) {
  
         super(name);
     }
    @Override
     public void handleRequest(LeaveRequest leavePeople) {
  
         if (leavePeople.getDayCount() <= 3) {
  
             System.out.println("请假人:" + leavePeople.getName() + ",天数:" + leavePeople.getDayCount() + ",理由:" + leavePeople.getRemarks());
             System.out.println("审批人:" + this.name + " 主任,审批通过!");
         }else {
  
             if (this.nextLeader != null) {
  
                 //让下一个继承者来处理这个问题
                 this.nextLeader.handleRequest(leavePeople);
             }
         }
     }
}
/**
  * 经理
  * @author guk
  *
  */
 public class Manager extends Leader {
  
     
     public Manager(String name) {
  
         super(name);
     }
    @Override
     public void handleRequest(LeaveRequest leader) {
  
         if (leader.getDayCount() <= 10) {
  
             System.out.println("请假人:" + leader.getName() + ",天数:" + leader.getDayCount() + ",理由:" + leader.getRemarks());
             System.out.println("审批人:" + this.name + " 经理,审批通过!");
         }else {
  
            if (this.nextLeader != null) {
   
                 //让下一个继承者来处理这个问题
                 this.nextLeader.handleRequest(leader);
             }
         }
     }
}
 /**
  * 请假的基本信息
  * @author guk
  *
  */
 public class LeaveRequest {
  
     private String name;//请假人
     private int dayCount;//请假天数
     private String remarks;//请假理由
     public LeaveRequest(String name, int dayCount, String remarks) {
  
         this.name = name;
         this.dayCount = dayCount;
         this.remarks = remarks;
     }
     public String getName() {
  
         return name;
     }
     public void setName(String name) {
  
         this.name = name;
     }
     public int getDayCount() {
  
         return dayCount;
     }
     public void setDayCount(int dayCount) {
  
         this.dayCount = dayCount;
     }
     public String getRemarks() {
  
         return remarks;
     }
     public void setRemarks(String remarks) {
  
         this.remarks = remarks;
     }
     
     
 }