设计模式之GOF23责任链模式

Posted code-fun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之GOF23责任链模式相关的知识,希望对你有一定的参考价值。

责任链模式chain of responsibility

将能够处理同一类请求的对象连成一条链,所提交的请求依次在链上传递,直到传递至有能力处理该请求的对象,不能则传给链上下一个

场景:

-打牌时

-奖学金审批

-请假审批

核心:是在客户端中才成链,也可以通过配置文件或者存在数组中加载

开发中常见场景:

-try catch异常链

-javascript语言中,事件的冒泡和捕获机制 Java语言中,事件处理采用观察者模式

-Servlet开发中,过滤器的链式处理

-Struts2中,拦截器的调用也是典型的链式处理

例子:工作中请假

0-3主任审批  3-10经理审批  10-30总经理审批

/**
 * 请假条
 * @author 小帆敲代码
 *
 */
public class LeaveRequest
   private String empName;
   private int leaveDays;
   private String reason;
   public String getEmpName()
    return empName;
   
   public void setEmpName(String empName)
    this.empName = empName;
   
   public int getLeaveDays()
    return leaveDays;
   
   public void setLeaveDays(int leaveDays)
    this.leaveDays = leaveDays;
   
   public String getReason()
    return reason;
   
   public void setReason(String reason)
    this.reason = reason;
   
   public LeaveRequest(String empName, int leaveDays, String reason)
    this.empName = empName;
    this.leaveDays = leaveDays;
    this.reason = reason;
   
public abstract class Leader
  protected String leaderName;
  protected Leader nextLeader;//责任链中的后继对象
  public Leader(String leaderName)
   this.leaderName = leaderName;
  
  //设置下一级领导
  public void setNetLeader(Leader leader)
   this.nextLeader=leader;
  
  //业务方法处理请假条
  public abstract void handler(LeaveRequest leaveRequest) ;
public class Director extends Leader
 public Director(String leaderName)
  super(leaderName);
 
 @Override
 public void handler(LeaveRequest leaveRequest)
    if(leaveRequest.getLeaveDays()<3)
     System.out.println("员工:"+leaveRequest.getEmpName()+",请假:"+leaveRequest.getLeaveDays()+",原因:"+leaveRequest.getReason());
     System.out.println("主任:"+this.leaderName+",审核通过!");
    else
     if(this.nextLeader!=null)
      nextLeader.handler(leaveRequest);
     else
      System.out.println("此员工可能想辞职");
     
    
 
public class Manager extends Leader
 public Manager(String leaderName)
  super(leaderName);
 
 @Override
 public void handler(LeaveRequest leaveRequest)
    if(leaveRequest.getLeaveDays()<10)
     System.out.println("员工:"+leaveRequest.getEmpName()+",请假:"+leaveRequest.getLeaveDays()+",原因:"+leaveRequest.getReason());
     System.out.println("经理:"+this.leaderName+",审核通过!");
    else
     if(this.nextLeader!=null)
      nextLeader.handler(leaveRequest);
     else
      System.out.println("此员工可能想辞职");
     
    
 
public class GeneralManager extends Leader
 public GeneralManager(String leaderName)
  super(leaderName);
 
 @Override
 public void handler(LeaveRequest leaveRequest)
    if(leaveRequest.getLeaveDays()<30)
     System.out.println("员工:"+leaveRequest.getEmpName()+",请假:"+leaveRequest.getLeaveDays()+",原因:"+leaveRequest.getReason());
     System.out.println("总经理:"+this.leaderName+",审核通过!");
    else
     if(this.nextLeader!=null)
      nextLeader.handler(leaveRequest);
     else
      System.out.println("此员工可能想辞职");
     
    
 
public class Client
 public static void main(String[] args)
   Leader a=new Director("张三");
   Leader b=new Manager("李四");
   Leader c=new GeneralManager("王五");
   
   //开始组织责任链
   a.setNetLeader(b);
   b.setNetLeader(c);
   
   LeaveRequest req1=new LeaveRequest("TOM", 2, "抓JACK");
   a.handler(req1);
 

以上是关于设计模式之GOF23责任链模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之GOF23责任链模式

前端设计模式之责任链模式

15-责任链(Chain of Responsibility)模式Ruby实现

架构设计之责任链模式在项目中的实际使用

责任链模式

GoF设计模式(十七) - 责任链模式