责任链模式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责任链模式的更多相关文章

  1. Python使用设计模式中的责任链模式与迭代器模式的示例

    Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...

  2. Java设计模式学习记录-责任链模式

    前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...

  3. 《java设计模式》之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  4. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  5. [设计模式] javascript 之 责任链模式

    责任链模式:定义 责任链接模式又称职责链模式,是一种对象的行为模式:它是一种链式结构,每个节点都有可能两种操作,要么处理该请求停止该请求操作,要么把请求转发到下一个节点,让下一个节点来处理请求:该模式 ...

  6. Java设计模式系列之责任链模式

    责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...

  7. 设计模式学习之责任链模式(Chain of Responsibility,行为型模式)(22)

    参考:http://www.cnblogs.com/zhili/p/ChainOfResponsibity.html 一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1 ...

  8. Java描述设计模式(15):责任链模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...

  9. Java设计模式13:责任链模式

    前言 来菜鸟这个大家庭10个月了,总得来说比较融入了环境,同时在忙碌的工作中也深感技术积累不够,在优秀的人身边工作必须更加花时间去提升自己的技术能力.技术视野,所以开一个系列文章,标题就轻松一点叫做最 ...

随机推荐

  1. D. AB-string

    https://codeforces.com/contest/1238/problem/D 题目大意:统计good string的个数,good string的定义,给定的字符串中含有回文段落, 题解 ...

  2. 串匹配问题 (KMP算法) 详解

    串这个概念对于我们学到现在的水平来说应该是经历颇丰了,因为在C语言中我们所用到的"串"知识是在字符串那里,有了这个概念,我们再去学习串就相对而言轻松多了. 那么,现在来介绍一下字符 ...

  3. SpringBoot集成Shiro实现权限控制

    Shiro简介 Apache Shiro是一个功能强大且易于使用的Java安全框架,用于执行身份验证,授权,加密和会话管理.使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序-从最小的移 ...

  4. 初识Cobalt Strike

    简介 Cobalt Strike 一款以metasploit为基础的GUI的框架式渗透工具,集成了端口转发.服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,jav ...

  5. Linux学习笔记(九)Vim文本编辑器的使用

    Vim文本编辑器的使用 Vim的工作模式 1.命令模式 2.输入模式 3.编辑模式 进入Vim 1.使用Vim打开文件 2.直接进入指定位置 Vim基本命令 1.插入命令 2.光标移动命令 3.使用V ...

  6. 从零开始的计算机网络基础(图文并茂,1.8w字,面试复习必备)

    前言 在互联网高速发展的今天,我们通过手机,电脑等通讯设备可以很轻松达到未出茅庐便知天下事的境界.每天我们都要访问数不胜数的网站,通过打开浏览器,输入网址两步搞定.当然更为常规的做法是打开浏览器,设置 ...

  7. MVC-第一个简单的程序

    来源于:https://www.cnblogs.com/miro/p/4030622.html 从空白开始,建立一个基本框架详细步骤 1,新建项目 NOTE:模板要选Empty,如果直接选MVC会产生 ...

  8. Java集合linkdList

    LinkedList特有功能: A:添加功能 public void addFitst(Object e) public void addLast(Object e) B:获取功能 public Ob ...

  9. Kubernetes笔记(一):十分钟部署一套K8s环境

    Kubernetes是Goole开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理 -- 百度百科. 接触K8s也有半年多了,也基于阿里云平台搭建了包含多级服务.目前运行较为稳定的 ...

  10. 小程序里button边框有黑线解决办法(自定义button样式)

    .go_to_user::after{ border:1px solid transparent; } button的class为go_to_user button{ padding:; box-si ...