职责链模式

news2024/11/23 19:12:14

职责链模式

1.职责链模式基本介绍

在这里插入图片描述

  1. 职责链模式(Chain of Responsibility Pattern), 又叫 责任链模式,为请求创建了一个接收者对象的链(简单示意图)。这种模式对请求的发送者和接收者进行解耦。

  2. 职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

  3. 这种类型的设计模式属于行为型模式

2.职责链模式的原理类图

image-20230115121526903

  • 对原理类图的说明-即(职责链模式的角色及职责)
  1. Handler : 抽象的处理者, 定义了一个处理请求的接口, 同时含义另外 Handler

  2. ConcreteHandlerA , B 是具体的处理者, 处理它自己负责的请求, 可以访问它的后继者(即下一个处理者), 如果可以处理当前请求,则处理,否则就将该请求交个 后继者去处理,从而形成一个职责链

  3. Request , 含义很多属性,表示一个请求

3.案例场景

3.1 职责链模式解决OA 系统采购审批

  • 应用实例要求

编写程序完成学校 OA 系统的采购审批项目:需求采购员采购教学器材

如果金额 小于等于 5000, 由教学主任审批如果金额 小于等于 10000, 由院长审批

如果金额 小于等于 30000, 由副校长审批如果金额 超过 30000 以上,有校长审批

  • 思路分析和图解(类图)

image-20230115121720422

  • 代码实现

请求类

//请求类
public class PurchaseRequest {

   private int type = 0; //请求类型
   private float price = 0.0f; //请求金额
   private int id = 0;
   //构造器
   public PurchaseRequest(int type, float price, int id) {
      this.type = type;
      this.price = price;
      this.id = id;
   }
   public int getType() {
      return type;
   }
   public float getPrice() {
      return price;
   }
   public int getId() {
      return id;
   }
}

处理者抽象类

public abstract class Approver {

   Approver approver;  //下一个处理者
   String name; // 名字
   
   public Approver(String name) {
      this.name = name;
   }

   //下一个处理者
   public void setApprover(Approver approver) {
      this.approver = approver;
   }
   
   //处理审批请求的方法,得到一个请求, 处理是子类完成,因此该方法做成抽象
   public abstract void processRequest(PurchaseRequest purchaseRequest);
   
}

教学主任

public class CollegeApprover extends Approver {

   public CollegeApprover(String name) {
      super(name);
   }
   
   @Override
   public void processRequest(PurchaseRequest purchaseRequest) {
      if(purchaseRequest.getPrice() < 5000 && purchaseRequest.getPrice() <= 10000) {
         System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
      }else {
         approver.processRequest(purchaseRequest);
      }
   }
}

副校长

public class ViceSchoolMasterApprover extends Approver {

   public ViceSchoolMasterApprover(String name) {
      super(name);
   }
   
   @Override
   public void processRequest(PurchaseRequest purchaseRequest) {
      if(purchaseRequest.getPrice() < 10000 && purchaseRequest.getPrice() <= 30000) {
         System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
      }else {
         approver.processRequest(purchaseRequest);
      }
   }
}

校长

public class SchoolMasterApprover extends Approver {

   public SchoolMasterApprover(String name) {
      super(name);
   }
   
   @Override
   public void processRequest(PurchaseRequest purchaseRequest) {
      if(purchaseRequest.getPrice() > 30000) {
         System.out.println(" 请求编号 id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
      }else {
         approver.processRequest(purchaseRequest);
      }
   }
}

调用方

public class Client {

   public static void main(String[] args) {
      //创建一个请求
      PurchaseRequest purchaseRequest = new PurchaseRequest(1, 31000, 1);
      
      //创建相关的审批人
      DepartmentApprover departmentApprover = new DepartmentApprover("张主任");
      CollegeApprover collegeApprover = new CollegeApprover("李院长");
      ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("王副校");
      SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("佟校长");
   
      //需要将各个审批级别的下一个设置好 (处理人构成环形: )
      departmentApprover.setApprover(collegeApprover);
      collegeApprover.setApprover(viceSchoolMasterApprover);
      viceSchoolMasterApprover.setApprover(schoolMasterApprover);
      schoolMasterApprover.setApprover(departmentApprover);
      
      departmentApprover.processRequest(purchaseRequest);
      viceSchoolMasterApprover.processRequest(purchaseRequest);
   }

}

4.职责链模式的注意事项和细节

  1. 将请求和处理分开,实现解耦,提高系统的灵活性

  2. 简化了对象,使对象不需要知道链的结构

  3. 性能会受到影响,特别是在链比较长的时候,因此需控制链中最大节点数量,一般通过在 Handler 中设置一个最大节点数量,在 setNext()方法中判断是否已经超过阀值,超过则不允许该链建立,避免出现超长链无意识地破坏系统性能

  4. 调试不方便。采用了类似递归的方式,调试时逻辑可能比较复杂

  5. 最佳应用场景:有多个对象可以处理同一个请求时,比如:多级请求、请假/加薪等审批流程、Java Web 中 Tomcat
    对 Encoding 的处理、拦截器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷歌搜索引擎排名规则(谷歌 seo 外链重要还是内容重要)

谷歌外链仍然是Google排名前三的因素之一&#xff0c;这意味着你根本不能忽视外链带来的排名。如果不建立高质量的链接&#xff0c;现实情况是&#xff0c;你的竞争性关键字和搜索词不会有高排名的。 并非所有外链都是平等的。事实上&#xff0c;错误类型的链接可能会损害您的…

一次线上事故,我顿悟了MongoDB的精髓

目录MongoDB拒绝连接&#xff1f;显然是MongoDB服务又挂了。mongodb启动异常&#xff1a;about to fork child process, waiting until server is ready for connection一、什么是MongoDB分片&#xff1f;二、MongoDB如何分片?三、何时分片&#xff1f;四、搭建MongoDB分片服务…

算法:链表(力扣+牛客经典题)

链表 力扣 203. 移除链表元素 思路&#xff1a;使用while循环每找到指定的值&#xff0c;就把下一个节点指向下下个节点的位置 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int…

【指针笔试题下】你知道大厂面试题的指针题是什么样的吗?快来通过这些面试题目检测一下自己吧!

目录 前言 笔试题1&#xff1a; 笔试题2&#xff1a; 笔试题3&#xff1a; 笔试题4&#xff1a; 笔试题5&#xff1a; 笔试题6&#xff1a; 笔试题7&#xff1a; 笔试题8&#xff1a; 总结&#xff1a; 博客主页&#xff1a;张栩睿的博客主页 欢迎关注&#xff1a;点赞收藏留…

JVM--Garbage First(G1) 垃圾收集器

G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。G1垃圾回收器是在Java7 update 4之后引入的一个新的垃圾回收器&#xff0c;在 JDK9 中更被指定为官方GC收集器一、G1…

【零基础】学python数据结构与算法笔记12

文章目录前言74.AVL树的概念75.AVL:旋转76.AVL:旋转实现177.AVL:旋转实现278.AVL:插入79.AVL树应用与数据结构总结总结前言 学习python数据结构与算法&#xff0c;学习常用的算法&#xff0c; b站学习链接 74.AVL树的概念 首先看一下二叉搜索树的效率 平均情况下&#xff0c…

networkx学习(三) 小世界网络

networkx学习(三) 小世界网络 1.小世界网络模型 K-近邻规则网络的生成与可视化

彻底分析Arduino库安装和开发板库安装路径和方式

参考&#xff1a;https://blog.csdn.net/weixin_43794311/article/details/128631564&#xff0c;https://blog.csdn.net/t01051/article/details/103766886 一个最简单的安装esp8266和esp32的方法 在网址&#xff1a;https://arduino.me/download&#xff0c;下载对应的开发…

dp(七)把数字转化为字符串 (力扣版+牛客版) 跳台阶问题+最小花费跳台阶

目录 l剑指 Offer 46. 把数字翻译成字符串力扣版本 把数字翻译成字符串_牛客题霸_牛客网牛客版 滚动数组优化 跳台阶【一】 &#xff08;大数取模&#xff09;一 八个零七 最小花费爬楼梯 l剑指 Offer 46. 把数字翻译成字符串力扣版本 给定一个数字&#xff0c;按照对应的格…

【微信小程序入门到精通】—小程序实战构建售货平台首页

目录前言一、步骤阐述二、新建项目并梳理结构三、配置导航栏四、tabBar 实现五、轮播图实现总结前言 对于目前形式&#xff0c;微信小程序是一个热门&#xff0c;那么我们该如何去学习并且掌握之后去做实际项目呢&#xff1f; 为此我特意开设此专栏&#xff0c;在我学习的同时也…

买车是个计算题,看上了比亚迪的宋DMI,选择困难了,选择55km的还是,110km的,理科生一起计算下。

1&#xff0c;背景 赶时髦&#xff0c;啥新鲜就购买啥&#xff0c;最火的车子当然是比亚迪宋dmi。 大家都买说明还不错&#xff0c;买车还要排队。等上一阵子了。 而且可以省下购置税。 就按照最热销的110 km 的版本 17/1.13*0.1 1.50 w 按照发票上“价税总计”金额计算的话…

计算两个字符串的相似度difflib.SequenceMatcher

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 计算两个字符串的相似度 difflib.SequenceMatcher 选择题 对于以下python代码表述错误的是? from difflib import SequenceMatcher myText1"我想学习Python做人工智能项目" myTex…

SpringCloud-Netflix学习笔记01——SpringCloud入门

一、SpringCloud是什么 Spring官网&#xff1a;https://spring.io/ SpringCloud, 基于SpringBoot提供了一套微服务解决方案&#xff0c;包括服务注册与发现&#xff0c;配置中心&#xff0c;全链路监控&#xff0c;服务网关&#xff0c;负载均衡&#xff0c;熔断器等组件&#…

mybatis plus基本使用初体验02

1.常用注解 1.1 TableName注解 MyBatis-Plus在确定操作的表时&#xff0c;由BaseMapper的泛型决定&#xff0c;即实体类型决定&#xff0c;且默认操作的表名和实体类型的类名一致。若实体类类型的类名和要操作的表的表名不一致&#xff0c;会出现什么问题&#xff1f; 将数据…

力扣sql基础篇(八)

力扣sql基础篇(八) 1 大满贯数量 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Championship的数字代表的就是赢得比赛的球员的id,可以使用行转列(UNION all) #如果涉及到分组函数,建议还是不要写除了分组字段外的其他字段,因为不太符合标准sql …

正则化:五重境界理解减少过拟合的神器

本文来自公众号“AI大道理” 正则化作为减少过拟合的手段被大量的使用&#xff0c;那么为什么会出现过拟合呢&#xff1f;正则化又是什么&#xff1f;是怎么样发挥作用的呢&#xff1f; 1、过拟合是什么&#xff1f; 过拟合是指模型在训练集上取得很高的识别性能&#xff0c…

Ubuntu 22.04配置静态IP地址

1、查看ip地址网卡名称&#xff1a;ifconfig 2、编辑网卡配置文件&#xff1a;sudo vim /etc/netplan/01-network-manager-all.yaml 默认样式&#xff1a; network: version: 2 renderer: NetworkManager 3、修改为&#xff1a; network: ethernets: enp7s0: dhcp4: no dhcp6: …

【Kotlin】集合操作 ① ( List 创建与元素获取 | 安全获取集合元素 | getOrElse | getOrNull )

文章目录一、List 创建与元素获取二、安全获取集合元素1、getOrElse 函数2、getOrNull函数三、List 创建与元素获取代码示例一、List 创建与元素获取 Kotlin 中的集合分为两类 , 只读集合 和 可变集合 ; 调用 listOf 函数 , 可以 直接创建 List 集合 ; 通过 [] 下标可以 直接获…

Spring系列 容器

创建容器 方式一&#xff1a;类路径加载配置文件&#xff1a; ApplicationContext ctx new ClassPathXmlApplicationContext("applicationContext.xml"); 方式二&#xff1a;文件路径加载配置文件&#xff08;用绝对路径&#xff09;&#xff1a; ApplicationConte…

闲话统信UOS

这周统信UOS正式在官网发布了22.0镜像统信UOS家庭版官网-正版国产操作系统--统信软件 (uniontech.com) 支持双系统&#xff1a;不影响原有系统使用&#xff0c;更换系统不担心电脑资料丢失&#xff1b; 官方应用商店&#xff1a;无病毒、放心安全下载&#xff0c;工作学习无打…