当前位置: 首页 > news >正文

设计模式:责任链模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《享元模式》                                                                   下一篇《解释器模式》

简介:

责任链模式,它是一种行为型设计模式,它将许多对象连接起来形成一条链,每个对象处理不同的请求,当一个请求从链的首端发出时,会沿着链路的路径依次传递给每一个对象,直到有对象处理该请求为止。

在责任链模式中,每个处理对象都包含对下一个处理对象的引用,请求会沿着这个链一路传递下去,直到找到一个能够处理该请求的处理对象。在这种模式下,请求的发送者并不知道哪个对象会处理该请求,因此系统可以在不影响客户端的情况下动态地重新组织和分配责任。

责任链模式的使用场景:
1、多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定。
2、在请求处理者不明确的情况下,向多个对象中的一个提交一个请求。
3、需要动态处理一组对象处理请求。

责任链模式的创建步骤:
1、定义一个抽象的处理器(Handler)接口,其中包含处理请求的方法以及设置下一个处理器的引用。例如:type Handler interface { SetNext(handler Handler) Handle(request interface{}) }。
2、创建具体的处理器类型,并且实现Handler接口。在处理请求时,如果当前处理器无法处理该请求,则将请求转发给下一个处理器。
3、将具体处理器初始化到链条中,并做抽象方法的具体实现。
4、设计链条结束标识,例如通过pos游标。

在实现责任链模式时,需要注意以下几点:
1、每个处理器都需要能够找到下一个处理器,因此需要在Handler接口中设置下一个处理器的引用。
2、每个处理器都需要能够处理其能够处理的请求,如果当前处理器无法处理该请求,则需要将请求转发给下一个处理器。
3、在设计链条时,需要注意如何将处理器正确地连接起来,以避免出现无限循环的情况。
4、在设计链条时,还需要考虑如何处理多个处理器同时能够处理同一请求的情况。

责任链模式的优点,主要包括:
1、降低对象之间的耦合度:责任链模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
2、增强系统的可扩展性:可以根据需要增加新的请求处理类,满足开闭原则。
3、增强给对象指派职责的灵活性:当工作流程发生变化时,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
4、简化对象之间的连接:每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的if或者if···else语句。
5、责任分担:每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

责任链模式的缺点,主要包括:
1、性能问题:每个请求都需要从链表头遍历到链表尾,特别是在链表比较长的情况下,性能会受到很大影响。
2、调试不方便:特别是当链表比较长,环节比较多的时候,由于采用了类似递归的方式,调试时可能逻辑比较复杂。

示例:

一、C#责任链模式

以下是一个示例,展示了如何在C#中实现责任链模式:

using System;  //定义一个处理者接口  
public interface IHandler  
{  void HandleRequest();  
}  //定义具体的处理者类1  
public class Handler1 : IHandler  
{  public void HandleRequest()  {  Console.WriteLine("Handler1处理请求"); }  
}  //定义具体的处理者类2  
public class Handler2 : IHandler  
{  public void HandleRequest()  {  Console.WriteLine("Handler2处理请求");  }  
}  //定义请求类  
public class Request  
{  private string requestType;public Request(string requestType){ this.requestType = requestType;}  public string GetRequestType(){return this.requestType;}  
}  
//定义请求处理器(RequestProcessor)类,它持有一个处理者(Handler)的引用,并调用它的handleRequest方法。如果当前处理者不能处理该请求,它将请求传递给链中的下一个处理者。  
public class RequestProcessor {  private IHandler handler;  public RequestProcessor(IHandler handler) {  this.handler = handler;  }  public void ProcessRequest(Request request) {  handler.handleRequest();  }  
}
//使用示例:
class Program  
{  static void Main(string[] args)  {  		IHandler handler1 = new Handler1();  IHandler handler2 = new Handler2();  Request request1 = new Request("Request1");  Request request2 = new Request("Request2");  RequestProcessor processor1 = new RequestProcessor(handler1);  processor1.ProcessRequest(request1);  // 输出 "Handler1 handled the request."  processor1.ProcessRequest(request2);  // 输出 "Handler2 handled the request."  }  
}

二、java责任链模式

责任链模式通常通过以下方式实现:

// 定义一个处理者(Handler)接口  
public interface Handler {  void handleRequest();  
}  // 定义具体处理者类1(ConcreteHandler1)  
public class ConcreteHandler1 implements Handler {  @Override  public void handleRequest() {  System.out.println("ConcreteHandler1 handled the request.");  }  
}  // 定义具体处理者类2(ConcreteHandler2)  
public class ConcreteHandler2 implements Handler {  @Override  public void handleRequest() {  System.out.println("ConcreteHandler2 handled the request.");  }  
}  // 定义请求类(Request)  
public class Request {  private String requestType;  public Request(String requestType) {  this.requestType = requestType;  }  public String getRequestType() {  return requestType;  }  
}  // 定义请求处理器(RequestProcessor)类,它持有一个处理者(Handler)的引用,并调用它的handleRequest方法。如果当前处理者不能处理该请求,它将请求传递给链中的下一个处理者。  
public class RequestProcessor {  private Handler handler;  public RequestProcessor(Handler handler) {  this.handler = handler;  }  public void processRequest(Request request) {  handler.handleRequest();  }  
}  // 测试类(Test)用于模拟客户端代码。它创建了几个处理者和请求对象,并使用请求处理器来处理请求。  
public class Test {  public static void main(String[] args) {  // 创建几个处理者对象和请求对象。注意,ConcreteHandler2 的 handleRequest 方法会在请求类型为 "Request2" 时被调用。  Handler handler1 = new ConcreteHandler1();  Handler handler2 = new ConcreteHandler2();  Request request1 = new Request("Request1");  Request request2 = new Request("Request2");  Request request3 = new Request("Request3");  // 使用请求处理器来处理请求。注意,每个请求处理器都可以持有一个处理者对象,并在需要时将请求传递给这个处理者对象。这种设计方式使得你可以轻松地改变请求的处理流程。  RequestProcessor processor1 = new RequestProcessor(handler1);  processor1.processRequest(request1);  // 输出 "ConcreteHandler1 handled the request."  processor1.processRequest(request2);  // 输出 "ConcreteHandler2 handled the request."  因为ConcreteHandler2 可以处理Request2 类型的请求. 这里因为处理器链条的设置,没有找到合适的处理器,所以会输出 "No handler can handle the request." 而不会继续传递给下一个处理器。因此,在这种情况下,处理器链条的最后一个处理器决定了处理结果。同理,对于类型为 "Request3" 的请求也没有找到合适的处理器来处理,因此输出 "No handler can handle the request."。

三、javascript责任链模式

在JavaScript中,责任链实现方式如下:

class Handler {  constructor() {  this.next = null;  }  handleRequest(request) {  if (this.canHandle(request)) {  console.log(`${this.name} handled request ${request}`);  return true;  } else if (this.next) {  return this.next.handleRequest(request);  } else {  console.log('No handler found for request');  return false;  }  }  canHandle(request) {  return false;  }  
}  class HandlerA extends Handler {  constructor() {  super();  this.name = 'HandlerA';  }  canHandle(request) {  return request.type === 'A';  }  
}  class HandlerB extends Handler {  constructor() {  super();  this.name = 'HandlerB';  }  canHandle(request) {  return request.type === 'B';  }  
}  class HandlerC extends Handler {  constructor() {  super();  this.name = 'HandlerC';  }  canHandle(request) {  return request.type === 'C';  }  
}
//使用示例:
const handlerA = new HandlerA();  
const handlerB = new HandlerB();  
const handlerC = new HandlerC();  
handlerA.next = handlerB; handlerB.next = handlerC;   
handlerA.handleRequest({ type: 'A' }); // Output: HandlerA handled request A   
handlerA.handleRequest({ type: 'B' }); // Output: HandlerA handled request B   
handlerA.handleRequest({ type: 'C' }); // Output: HandlerA handled request C   
handlerA.handleRequest({ type: 'D' }); // Output: No handler found for request

四、C++责任链模式

以下是在C++中实现责任链模式:

#include <iostream>  
using namespace std;  // 定义责任链中的节点类  
class Handler {  
public:  virtual bool canHandle(int request) = 0;  virtual void handleRequest(int request) = 0;  
};  // 定义具体的处理器类  
class HandlerA : public Handler {  
public:  bool canHandle(int request) {  return request >= 1 && request <= 5;  }  void handleRequest(int request) {  cout << "HandlerA handles request: " << request << endl;  }  
};  class HandlerB : public Handler {  
public:  bool canHandle(int request) {  return request > 5 && request <= 10;  }  void handleRequest(int request) {  cout << "HandlerB handles request: " << request << endl;  }  
};  class HandlerC : public Handler {  
public:  bool canHandle(int request) {  return request > 10 && request <= 15;  }  void handleRequest(int request) {  cout << "HandlerC handles request: " << request << endl;  }  
};  // 定义责任链类,负责将请求传递给合适的处理器节点进行处理  
class ResponsibilityChain {  
private:  Handler* head;  
public:  ResponsibilityChain(Handler* handler) {  head = handler;  }  void processRequest(int request) {  Handler* currentHandler = head;  while (currentHandler != nullptr) {  if (currentHandler->canHandle(request)) {  currentHandler->handleRequest(request);  break;  } else {  currentHandler = currentHandler->next;  }  }  }  
};  int main() {  // 创建责任链对象,并将处理器节点按顺序链接起来形成责任链  ResponsibilityChain chain(new HandlerA());  chain.processRequest(3); // HandlerA handles request: 3 输出:3的处理由HandlerA完成。

五、python责任链模式

以下是在python中实现责任链模式:

class Handler:  def __init__(self):  self.next = None  def handle_request(self, request):  if self.can_handle(request):  print(f"{self.__class__.__name__} handles request: {request}")  return True  elif self.next:  return self.next.handle_request(request)  else:  print("No handler found for request")  return False  def can_handle(self, request):  return False  class ConcreteHandlerA(Handler):  def can_handle(self, request):  return request <= 5  class ConcreteHandlerB(Handler):  def can_handle(self, request):  return request > 5 and request <= 10  class ConcreteHandlerC(Handler):  def can_handle(self, request):  return request > 10 and request <= 15  def main():  handlerA = ConcreteHandlerA()  handlerB = ConcreteHandlerB()  handlerC = ConcreteHandlerC()  handlerA.next = handlerB  handlerB.next = handlerC  handlerA.handle_request(3) # Output: ConcreteHandlerA handles request: 3  handlerA.handle_request(6) # Output: ConcreteHandlerB handles request: 6  handlerA.handle_request(12) # Output: ConcreteHandlerC handles request: 12  handlerA.handle_request(18) # Output: No handler found for request  if __name__ == "__main__":  main()

六、go责任链模式

以下是一个示例,展示了如何在go中实现责任链模式:

package main  import "fmt"  type Handler interface {  HandleRequest() bool  
}  type ConcreteHandlerA struct{}  func (h ConcreteHandlerA) HandleRequest() bool {  fmt.Println("ConcreteHandlerA handles request")  return true  
}  type ConcreteHandlerB struct{}  func (h ConcreteHandlerB) HandleRequest() bool {  fmt.Println("ConcreteHandlerB handles request")  return true  
}  type ConcreteHandlerC struct{}  func (h ConcreteHandlerC) HandleRequest() bool {  fmt.Println("ConcreteHandlerC handles request")  return true  
}  func main() {  handlerA := ConcreteHandlerA{}  handlerB := ConcreteHandlerB{}  handlerC := ConcreteHandlerC{}  handlerA.HandleRequest() // Output: ConcreteHandlerA handles request  handlerB.HandleRequest() // Output: ConcreteHandlerB handles request  handlerC.HandleRequest() // Output: ConcreteHandlerC handles request  
}

七、PHP责任链模式

以下是一个示例,展示了如何在PHP中实现责任链模式:

<?php  interface HandlerInterface {  public function handleRequest($request);  
}  class ConcreteHandlerA implements HandlerInterface {  private $nextHandler;  public function __construct(HandlerInterface $nextHandler) {  $this->nextHandler = $nextHandler;  }  public function handleRequest($request) {  if ($request <= 5) {  echo "ConcreteHandlerA handles request: $request\n";  return true;  } elseif ($this->nextHandler) {  return $this->nextHandler->handleRequest($request);  } else {  echo "No handler found for request\n";  return false;  }  }  
}  class ConcreteHandlerB implements HandlerInterface {  private $nextHandler;  public function __construct(HandlerInterface $nextHandler) {  $this->nextHandler = $nextHandler;  }  public function handleRequest($request) {  if ($request > 5 && $request <= 10) {  echo "ConcreteHandlerB handles request: $request\n";  return true;  } elseif ($this->nextHandler) {  return $this->nextHandler->handleRequest($request);  } else {  echo "No handler found for request\n";  return false;  }  }  
}  class ConcreteHandlerC implements HandlerInterface {  private $nextHandler;  public function __construct(HandlerInterface $nextHandler) {  $this->nextHandler = $nextHandler;  }  public function handleRequest($request) {  if ($request > 10 && $request <= 15) {  echo "ConcreteHandlerC handles request: $request\n";  return true;  } elseif ($this->nextHandler) {  return $this->nextHandler->handleRequest($request);  } else {  echo "No handler found for request\n";  return false;  }  }  
}  $handlerA = new ConcreteHandlerA(new ConcreteHandlerB(new ConcreteHandlerC()));  
$handlerA->handleRequest(3); // Output: ConcreteHandlerA handles request: 3  
$handlerA->handleRequest(6); // Output: ConcreteHandlerB handles request: 6  
$handlerA->handleRequest(12); // Output: ConcreteHandlerC handles request: 12  
$handlerA->handleRequest(18); // Output: No handler found for request  ?>


《完结》
上一篇《享元模式》                                                                              下一篇《解释器模式》

相关文章:

设计模式:责任链模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《享元模式》 下一篇《解释器模式》 简介&#xff1a; 责任链模式&#xff0c;它是一种行为型设计模式&#xff0c;它将许多对象连接起来形成一条链&#xff0c;每个对象处理不同的请求&#xff0c…...

koa搭建服务器(二)

在上一篇文章已经成功的运行了一个http服务器&#xff0c;接下来就是使用Sequelize ORM&#xff08;官方文档&#xff1a;Sequelize 简介 | Sequelize中文文档 | Sequelize中文网&#xff09;来操作数据库。 1、安装依赖 首先也是需要安装相关的依赖 npm i sequelize npm i …...

LeetCode 125 验证回文串 简单

题目 - 点击直达 1. 125 验证回文串 简单1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 1. 125 验证回文串 简单 1. 题目详情 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反…...

Android底层摸索改BUG(一):Android系统状态栏显示不下Wifi图标

这是我入职的第一个BUG&#xff0c;头疼&#xff0c;隔壁实习生一周解决了&#xff0c;我多花了几天 其中最大的原因就是我思考复杂了&#xff0c;在公司系统上&#xff0c;此BUG标题为&#xff1a; 请确认Wifi优先级&#xff0c;状态栏Wifi被忽略 BUG意思就是&#xff1a;当…...

第十三章---枚举类型与泛型

一&#xff0c;枚举类型 1.使用枚举类型设置常量 设置常量时&#xff0c;我们通常将常量放置在接口中&#xff0c;这样在程序中就可以直接使用。该常量稚因为在接口中定义常量时&#xff0c;该常量的修饰符为 final 与 static。 public interface Constants ( public static …...

shell语法大全(超级详细!!!!),非常适合入门

本文旨在对y总的Linux基础课shell语法做学习记录&#xff0c;指令较多&#xff0c;方便日后查找。 参考视频&#xff1a;Linux基础课 参考教程&#xff1a;Linux教程 1 概论 Linux中常见的shell脚本有很多种&#xff0c;常见的有&#xff1a; Bourne Shell(/usr/bin/sh或/bi…...

【Python机器学习】零基础掌握ExtraTreesRegressor集成学习

面临的问题:如何更准确地预测糖尿病患者的病情? 在医疗领域,准确预测疾病的发展状况是至关重要的。尤其是对于糖尿病这样的慢性病,一个精准的预测模型能帮助医生制定更有效的治疗方案。但问题是,如何构建一个高准确度的预测模型呢? 假设现有一组糖尿病患者的医疗数据,…...

网络协议--TCP的交互数据流

19.1 引言 前一章我们介绍了TCP连接的建立与释放&#xff0c;现在来介绍使用TCP进行数据传输的有关问题。 一些有关TCP通信量的研究如[Caceres et al. 1991]发现&#xff0c;如果按照分组数量计算&#xff0c;约有一半的TCP报文段包含成块数据&#xff08;如FTP、电子邮件和U…...

IOC课程整理-13 Spring校验

1. Spring 校验使用场景 2. Validator 接口设计 3. Errors 接口设计 4. Errors 文案来源 5. 自定义 Validator 6. Validator 的救赎 7. 面试题精选 Spring 校验接口是哪个 org.springframework.validation.Validator Spring 有哪些校验核心组件&#xff1f;...

SSM咖啡点餐管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 咖啡点餐管理系统是一套完善的信息系统&#xff0c;结合SSM框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开…...

Capacitor 打包 h5 到 Android 应用,uniapp https http net::ERR_CLEARTEXT_NOT_PERMITTED

Capacitor 打包 h5 到 Android 应用&#xff0c;uniapp https http net::ERR_CLEARTEXT_NOT_PERMITTED capacitor 官网&#xff1a; https://capacitorjs.com/docs/ 项目上需要做一个 app&#xff0c;而这个 app 是用 uniapp 做的&#xff0c;里面用到了一个依赖 dom 的库&…...

华为数通方向HCIP-DataCom H12-831题库(多选题:101-120)

第101题 LSR对收到的标签进行保留,且保留方式有多种,那么以下关于LDP标签保留一自由方式的说法 A、保留邻居发送来的所有标签 B、需要更多的内存和标签空间 C、只保留来自下一跳邻居的标签,丢弃所有非下一跳铃邻居发来的标签 D、节省内存和标签空间 E、当IP路由收敛、下一跳…...

misc学习(4)Traffic(流量分析)-

感悟&#xff1a;回想起自己学的计算机网络和网络协议分析&#xff0c;有所感悟&#xff1a;计算机网络好比将一群人区分开来&#xff08;局域网&#xff09;&#xff0c;为了能够使得不同部分的人能够沟通&#xff08;wireshark中的数据包&#xff09;&#xff0c;就设置了网络…...

Less的基本语法

less的每一个语句后必须使用";"结束&#xff0c;否则可能无法正确的转换成css 1、导入 即在当前less文件中引用其它less文件&#xff0c;被引入的less文件中的内容可以在此less文件中使用。在引用less文件时可以省略扩展名 import "global"; // global.…...

spring boot项目优雅停机

1、关闭流程 停止接收请求和内部线程。判断是否有线程正在执行。等待正在执行的线程执行完毕。停止容器。 2、关闭过程有新的请求 在kill Spring Boot项目时&#xff0c;如果有访问请求过来&#xff0c;请求会被拒绝并返回错误提示。 在kill Spring Boot项目时&#xff0c;Sp…...

链式存储方式下字符串的replace(S,T1,T2)运算

链式存储方式下字符串的replace运算 ⭐️题目⭐️思路⭐️代码✨定义结点✨打印字符串函数✨计算字符串函数✨初始化字符串函数✨代码解读✨字符串替换函数✨字符串替换函数解读✨ 主函数✨完整代码 实现在链式存储下字符串的replace(S,T1,T2)&#xff0c;来自课本习题的一道题…...

unity脚本_Mathf和Math c#

首先创建一个脚本 当我们要做一个值趋近于一个值变化时 可以用Mathf.Lerp(start,end,time);方法实现 比如物体跟随...

轻量级仿 Spring Boot=嵌入式 Tomcat+Spring MVC

啥&#xff1f;Spring Boot 不用&#xff1f;——对。就只是使用 Spring MVC Embedded Tomcat&#xff0c;而不用 Boot。为啥&#xff1f;——因为 Boot 太重了&#xff1a;&#xff09; 那是反智吗&#xff1f;Spring Boot 好好的就只是因为太重就不用&#xff1f;——稍安勿…...

笔记Kubernetes核心技术-之Controller

2、Controller 2.1、概述 在集群上管理和运行容器的对象&#xff0c;控制器(也称为&#xff1a;工作负载)&#xff0c;Controller实际存在的&#xff0c;Pod是抽象的&#xff1b; 2.2、Pod和Controller关系 Pod是通过Controller实现应用运维&#xff0c;比如&#xff1a;弹…...

Azure云工作站上做Machine Learning模型开发 - 全流程演示

目录 本文内容先决条件从“笔记本”开始设置用于原型制作的新环境&#xff08;可选&#xff09;创建笔记本开发训练脚本迭代检查结果 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...