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

设计模式13:职责链模式

 系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客

1.概述

     职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着处理者链传递,直到有一个处理者能够处理该请求。这种模式通过避免发送者和接收者之间的直接耦合,使得多个对象都有机会处理请求,从而增强了系统的灵活性和可扩展性。每个处理者包含对其下一个处理者的引用,如果当前处理者无法处理请求,则会将请求转发给其后续的处理者。

2.结构与实现

结构:

  • Handler(抽象处理者):定义一个接口或抽象类,声明用于处理请求的方法,并维护对下一个处理者的引用。
  • ConcreteHandler(具体处理者):继承自Handler,实现处理请求的具体逻辑。如果不能处理请求,则将请求转发给下一个处理者。
  • Client(客户端):创建职责链,并向链上的第一个处理者发起请求。

实现:

参照概述的中例子,实现如下:

以银行贷款审批流程为例:

  • 定义Approver作为抽象处理者。
  • JuniorManagerMiddleManager, 和 SeniorManager作为具体处理者。
  • PurchaseRequest表示请求对象。

main.cpp:

/*********************************************代码说明:1.PurchaseRequest 类:表示一个采购请求,包含请求编号和金额。2.Approver 类:审批人的基类,包含一个指向下一个审批人的指针 successor,并定义了处理请求的接口 processRequest。3.JuniorManager、MiddleManager、SeniorManager 类:分别表示初级、中级、高级经理,继承自 Approver,并实现了 processRequest 方法,根据金额决定是否处理请求或交给下一个审批人。4.main 函数:创建了三个审批人对象,并设置了责任链。然后创建了三个采购请求,并通过初级经理开始处理这些请求。责任链模式:责任链模式允许你将请求沿着处理链传递,直到有一个对象处理它为止。在这个例子中,请求会根据金额的大小被不同的经理处理。************************************************/#include <QCoreApplication>
#include <iostream>// 定义一个采购请求类
class PurchaseRequest {
private:int requestNumber;  // 请求编号double amount;      // 请求金额
public:// 构造函数,初始化请求编号和金额PurchaseRequest(int number, double amount): requestNumber(number), amount(amount) {}// 获取请求编号int getRequestNumber() const { return requestNumber; }// 获取请求金额double getAmount() const { return amount; }
};// 定义一个审批人类,作为基类
class Approver {
protected:Approver* successor; // 指向下一个审批人的指针
public:// 构造函数,初始化 successor 为 nullptrApprover() : successor(nullptr) {}// 虚析构函数,确保派生类的析构函数被正确调用virtual ~Approver() {}// 设置下一个审批人void setSuccessor(Approver* successor) {this->successor = successor;}// 纯虚函数,处理请求的接口virtual void processRequest(PurchaseRequest* request) = 0;
};// 初级经理类,继承自 Approver
class JuniorManager : public Approver {
public:// 处理请求的具体实现void processRequest(PurchaseRequest* request) override{if(request->getAmount() < 10000){  // 如果金额小于 10000,初级经理可以处理std::cout << "Junior Manager approves request #" << request->getRequestNumber() << std::endl;} else if (successor != nullptr) {  // 否则交给下一个审批人处理successor->processRequest(request);}}
};// 中级经理类,继承自 Approver
class MiddleManager : public Approver {
public:// 处理请求的具体实现void processRequest(PurchaseRequest* request) override{if(request->getAmount() >= 10000 && request->getAmount() < 50000){  // 如果金额在 10000 到 50000 之间,中级经理可以处理std::cout << "Middle Manager approves request #" << request->getRequestNumber() << std::endl;} else if (successor != nullptr) {  // 否则交给下一个审批人处理successor->processRequest(request);}}
};// 高级经理类,继承自 Approver
class SeniorManager : public Approver {
public:// 处理请求的具体实现void processRequest(PurchaseRequest* request) override{if(request->getAmount() >= 50000){  // 如果金额大于等于 50000,高级经理可以处理std::cout << "Senior Manager approves request #" << request->getRequestNumber() << std::endl;} else if (successor != nullptr) {  // 否则交给下一个审批人处理successor->processRequest(request);}}
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建审批人对象Approver* juniorManager = new JuniorManager();Approver* middleManager = new MiddleManager();Approver* seniorManager = new SeniorManager();// 设置责任链:初级经理 -> 中级经理 -> 高级经理juniorManager->setSuccessor(middleManager);middleManager->setSuccessor(seniorManager);// 创建采购请求PurchaseRequest request1(1, 9000);   // 金额 9000,应由初级经理处理PurchaseRequest request2(2, 25000);  // 金额 25000,应由中级经理处理PurchaseRequest request3(3, 60000); // 金额 60000,应由高级经理处理// 处理请求juniorManager->processRequest(&request1); // 初级经理处理juniorManager->processRequest(&request2); // 中级经理处理juniorManager->processRequest(&request3); // 高级经理处理// 释放内存delete juniorManager;delete middleManager;delete seniorManager;return a.exec();
}

运行效果:

Junior Manager approves request #1
Middle Manager approves request #2
Senior Manager approves request #3

3.应用

职责链模式适用于以下场景:

  • 当有多个对象可能处理一个请求,但具体由哪个对象处理在运行时确定。
  • 需要动态指定一组对象来处理请求,例如日志记录系统中不同级别的日志处理器。
  • 希望解耦请求的发送者和接收者,比如事件监听器或回调机制。

4.优缺点及适用环境

优点:

  •  降低耦合度:发送者无需知道请求将被哪个接收者处理,仅需将请求传递给第一个处理者即可。
  • 增强灵活性:可以动态地调整链中的处理者顺序或添加新的处理者。
  • 简化对象职责:每个处理者只关注自己能否处理请求,而不需要关心整个处理流程。 

缺点:

  •  可能导致性能问题:若没有处理者能处理请求,可能会导致不必要的遍历。
  • 调试复杂性增加:由于请求的处理路径不固定,增加了追踪错误的难度 

应用环境:

  • 当需要处理某些请求的对象集合是动态的或未知的时候。
  • 不同的请求类型需要不同的处理方式,且这些方式可以在运行时改变。
  • 希望将复杂的业务逻辑拆分为一系列独立的小步骤,以便更容易理解和管理。

      通过职责链模式,我们可以构建更加灵活、易于扩展的应用程序,尤其是在涉及多种类型的请求处理时。然而,在使用此模式时也应注意其可能带来的性能损耗和复杂性的增加。

5.举一反三

职责链模式因其灵活性和可扩展性,在许多不同的实际场景中都有广泛的应用。除了银行审批流程外,以下是几个典型的实际使用场景:

1. 日志记录系统

在日志记录系统中,可以设置不同级别的日志处理器(如DebugLogger, InfoLogger, ErrorLogger等),每个处理器负责处理特定严重级别的日志消息。如果某个处理器无法处理(即消息的严重级别不在其范围内),它会将消息传递给下一个处理器。

应用场景:日志框架通常需要支持多种输出方式(控制台、文件、数据库等)和不同的日志级别。通过职责链模式,可以根据日志级别动态决定哪个处理器来处理日志信息。


2. GUI事件处理

图形用户界面(GUI)中的事件分发机制也可以采用职责链模式。例如,当用户点击一个按钮时,事件可能首先由按钮本身处理;如果没有被处理,则继续向上层容器传播,直到找到能够处理该事件的对象。

应用场景:复杂的GUI应用中,为了确保事件能够被正确的组件处理,同时允许组件具有独立性和复用性,职责链模式提供了一种有效的解决方案。

3. Web请求过滤器


在网络应用程序中,尤其是基于Servlet的Java Web应用程序中,可以使用过滤器链(Filter Chain)来实现请求预处理或后处理。每个过滤器负责执行特定的任务(如身份验证、压缩响应等),然后决定是否将请求转发给下一个过滤器。

应用场景:在构建Web服务时,为了解耦各种横切关注点(如安全检查、性能监控等),可以使用职责链模式组织这些逻辑。


4. 异常处理

在某些编程环境中,异常处理机制可以通过职责链模式来实现。每个“异常处理器”尝试捕获并处理异常,若当前处理器不能处理,则将异常传递给下一个处理器。

应用场景:对于那些需要灵活且可配置的异常处理策略的系统来说,职责链模式可以帮助开发者轻松地添加新的异常处理逻辑而不影响现有代码。


5. 工作流引擎


在企业级工作流管理系统中,任务的执行顺序和条件判断非常复杂。通过职责链模式,可以设计出灵活的工作流定义,使得任务能够按照预定规则自动流转。

应用场景:在自动化办公软件或业务流程管理系统(BPM)中,利用职责链模式可以有效地管理和调度任务,提高工作效率。


6. 中间件架构


现代分布式系统中,中间件常常用于处理客户端和服务端之间的通信。每层中间件都可能对请求进行一些操作(如加密解密、协议转换等),然后将请求转发给下一层中间件直至到达最终的服务端。

应用场景:构建微服务架构或SOA(Service-Oriented Architecture)时,通过职责链模式可以使各服务之间的交互更加模块化和易于维护。

相关文章:

设计模式13:职责链模式

系列总链接&#xff1a;《大话设计模式》学习记录_net 大话设计-CSDN博客 1.概述 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它允许将请求沿着处理者链传递&#xff0c;直到有一个处理者能够处理该请求。这种模式通过…...

MongoDB between ... and ... 操作

个人博客地址&#xff1a;​​​​​​​MongoDB between ... and ... 操作 | 一张假钞的真实世界 MongoDB中类似SQL的between and操作可以采用如下语法&#xff1a; db.collection.find( { field: { $gt: value1, $lt: value2 } } );...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_alloc函数

ngx_alloc 声明在 src\os\unix\ngx_alloc.h 中&#xff1a; void *ngx_alloc(size_t size, ngx_log_t *log); 定义在 src\os\unix\ngx_alloc.c 中&#xff1a; void * ngx_alloc(size_t size, ngx_log_t *log) {void *p;p malloc(size);if (p NULL) {ngx_log_error(NGX_LOG_…...

总结:Helm 命令详解

文章目录 1. Helm 概述2. Helm 的安装与配置2.1 安装 Helm2.2 验证安装 3、Helm 的常用命令3.1 查看帮助3.2 查看 Chart 列表3.3 安装 Chart3.4 卸载 Chart3.5 升级 Chart3.6 回滚 Chart3.7 查看 Chart 详细信息3.8 查看 Chart 的模板3.9 查看 Chart 的值3.10 管理仓库 4. Helm…...

通俗诠释 DeepSeek-V3 模型的 “671B” ,“37B”与 “128K”,用生活比喻帮你理解模型的秘密!

欢迎来到涛涛聊AI。 在DeepSeek-V3模型的参数描述中&#xff0c;你可能会看到类似“671B 37B 128K”这样的标记。这些字母和数字的组合看起来像密码&#xff0c;但其实它们揭示了模型的“大脑容量”和“工作方式”。我们用日常生活的比喻来解释&#xff1a; 一、数字含义&…...

【鸿蒙ArcTS】TypeScript学习记录:函数类型声明与箭头函数

普通函数 function add(x: number, y: number): number {return x y; } 完整未省略版本 const add: (x: number, y: number) > void//函数类型(x: number, y: number): void > {//函数定义console.log("object"); };函数类型&#xff1a; type trigFunc…...

基于 Python 和 Django 的北极星招聘数据可视化系统(附源码,部署)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

机器学习_18 K均值聚类知识点总结

K均值聚类&#xff08;K-means Clustering&#xff09;是一种经典的无监督学习算法&#xff0c;广泛应用于数据分组、模式识别和降维等领域。它通过将数据划分为K个簇&#xff0c;使得簇内相似度高而簇间相似度低。今天&#xff0c;我们就来深入探讨K均值聚类的原理、实现和应用…...

LTE参数

RSRP(Reference Singnal Received Power&#xff0c;参考信号接收功率) 是终端接收到的小区公共参考信号(CRS)功率值&#xff0c;数值为测量带宽内单个RE功率的线性平均值&#xff0c;反映的是本小区有用信号的强度。 SINR(SignaltoInterference&Noise Ratio&#xff0c;…...

Word写论文常用操作的参考文章

1.插入多个引用文献&#xff1a;word中交叉引用多篇参考文献格式[1-2]操作以及显示错误问题 更改左域名&#xff0c;输入 \#"[0" 更改右域名&#xff0c;输入 \#"0]" 2.插入题注&#xff1a;word 中添加图片题注、目录、内部链接 3.插入公式编号&#x…...

kubectl exec 实现的原理

kubectl exec 是 Kubernetes 提供的一个命令&#xff0c;它允许你在指定的 Pod 中执行命令&#xff0c;类似于在容器中打开一个终端会话。这个功能对于调试、监控和管理容器化应用非常有用。kubectl exec 的实现涉及到多个 Kubernetes 组件和机制&#xff0c;包括 API Server、…...

apache artemis安装

安装apache artemis https://xxzkid.github.io/2025/apache-artemis-install...

驱动开发、移植(最后的说法有误,以后会修正)

一、任务明确&#xff1a;把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作&#xff0c; sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。 2. 把TLIMX8-EVM的板子过一遍 把刚刚烧好系统的sd卡插入 创…...

算法12-贪心算法

一、贪心算法概念 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;从而希望导致全局最优解的算法。贪心算法的核心思想是“局部最优&#xff0c;全局最优”&#xff0c;即通过一系列局部最优选择&#xff0c;最…...

Docker容器化 | 超简单部署 FireCrawl

灵感来源 【RAG实战】Docker容器化 &#x1f525; FireCrawl | 基于docker-compose.yaml一键运行的网页解析API 参考仓库地址 建议给大佬点点star&#xff0c;这么简单的教程非常实用 测试环境 ubuntu 24.04 可能要安装的依赖 sudo apt install docker-buildx拉取FireCra…...

从入门到精通:Postman 实用指南

Postman 是一款超棒的 API 开发工具&#xff0c;能用来测试、调试和管理 API&#xff0c;大大提升开发效率。下面就给大家详细讲讲它的安装、使用方法&#xff0c;再分享些实用技巧。 一、安装 Postman 你能在 Postman 官网&#xff08;https://www.postman.com &#xff09;下…...

yolo11s rknn无法detect的bugfix - step by step

1.缘起 上周四下班时&#xff0c;发现在宿主机环境工作良好的既有的pytorch模型&#xff0c;在通过.pt->.onnx->.rknn的转换后无法正常工作。周五下班时&#xff0c;怀疑疑点在两处&#xff1a; 版本匹配问题通道和参数传递问题。 周六&#xff0c;周日&#xff0c;周…...

把 CSV 文件摄入到 Elasticsearch 中 - CSVES

在我们之前的很多文章里&#xff0c;我有讲到这个话题。在今天的文章中&#xff0c;我们就提重谈。我们使用一种新的方法来实现。这是一个基于 golang 的开源项目。项目的源码在 https://github.com/githubesson/csves/。由于这个原始的代码并不支持 basic security 及带有安全…...

尚硅谷爬虫note008

一、handler处理器 定制更高级的请求头 # _*_ coding : utf-8 _*_ # Time : 2025/2/17 08:55 # Author : 20250206-里奥 # File : demo01_urllib_handler处理器的基本使用 # Project : PythonPro17-21# 导入 import urllib.request from cgitb import handler# 需求&#xff…...

MongoDB数据导出工具mongoexport

个人博客地址&#xff1a;MongoDB数据导出工具mongoexport | 一张假钞的真实世界 导出示例&#xff1a; $ mongoexport --host 192.168.72.60 --db realtime_statistic_backup --collection all_play_stats_summary --fields "_id.timestamp,total_uv" --type csv …...

机器学习数学基础:29.t检验

t检验学习笔记 一、t检验的定义和用途 t检验是统计学中常用的假设检验方法&#xff0c;主要用于判断样本均值与总体均值间&#xff0c;或两个样本均值间是否存在显著差异。 在实际中应用广泛&#xff0c;例如在医学领域可用于比较两种药物的疗效&#xff1b;在教育领域&…...

Lineageos 22.1(Android 15) 编译隐藏API的 android.jar

一、前言 有时候会我们开发系统应用需要一些系统的方法或者属性之类的,但是被隐藏导致无法正常显示,因为SDK提供的android.jar被隐藏了,所以只能看到sourcecode,实际上编译是会报错的,比如: 一般这种无法是两种,直接添加一个类,同包名同类名,或者依赖framework.jar,可以骗过…...

floodfill算法系列一>扫雷游戏

目录 题目思路&#xff1a;代码设计&#xff1a;代码呈现&#xff1a; 题目思路&#xff1a; 代码设计&#xff1a; 代码呈现&#xff1a; class Solution {int m,n;int[] dx {0,0,-1,1,-1,-1,1,1};int[] dy {-1,1,0,0,-1,1,-1,1};public char[][] updateBoard(char[][] boa…...

2011年下半年软件设计师考试上午题真题的详细知识点分类整理(附真题及答案解析)

以下是针对2011年下半年软件设计师考试上午题真题的详细知识点分类整理&#xff0c;涵盖所有题目涉及的核心知识点&#xff0c;供考生背诵记忆&#xff1a; 1. 数据结构与算法 树与图&#xff1a; 树的性质&#xff1a;树的节点数、深度、叶子节点数之间的关系。二叉树遍历&am…...

算法基础 -- Fenwick树的实现原理

线段树与Fenwick树详解及C语言实现 线段树简介 线段树&#xff08;Segment Tree&#xff09;是一种二叉树结构&#xff0c;主要用于在数组修改的同时&#xff0c;快速进行区间查询。常见应用包括区间求和、区间最小值、区间最大值等。 线段树的特点 时间复杂度&#xff1a;…...

萌新学 Python 之集合 set

集合 set&#xff1a;使用一对大括号&#xff0c;元素写在大括号之间&#xff0c;使用逗号分隔 集合中的元素只能是不可变的数据类型&#xff0c;不能是列表、字典和集合 set1 {1, 2, 3} set2 {1, a, (1, 2, 3)} print(type(set1), type(set2)) # <class set> <c…...

(4)ENVI-guide的设置

1 General Settings 打开ENVI-guide&#xff0c;设置你的模拟时间&#xff0c;模拟名称以及输出文件所在位置 注意&#xff0c;选择多核心和单核运行的方式是 1&#xff09;如果只有一个模拟&#xff0c;并且需要尽快输出&#xff0c;并且运行文件的电脑可以暂时不需要进行其他…...

Golang学习笔记_32——适配器模式

Golang学习笔记_29——抽象工厂模式 Golang学习笔记_30——建造者模式 Golang学习笔记_31——原型模式 文章目录 一、核心概念二、模式结构三、模式特点四、实现方式对比五、适用场景六、与其他模式的对比1. 与装饰器模式2. 与外观模式3. 与创建型模式&#xff08;工厂/原型&am…...

python知识和项目经验

一些功能的实现 从.py文件中获取函数对象和参数 的字典 在给定的Python脚本中&#xff0c;通过模块导入和反射机制&#xff0c;如何动态获取包含模型函数的模块中的函数及其默认参数&#xff0c;并构建一个字典以便后续使用&#xff1f; 解决方案 test.py # test.py impor…...

【自学笔记】版本控制与持续集成基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 版本控制与持续集成基础知识点总览版本控制&#xff08;Version Control&#xff09;1. 版本控制简介2. 常用版本控制系统3. Git基础4. Git进阶 持续集成&#xff0…...

云平台结合DeepSeek的AI模型优化实践:技术突破与应用革新

目录 前言 一、技术架构&#xff1a;算力与算法的协同基石 1. 蓝耘平台的核心优势 2. DeepSeek的模型创新 二、应用场景&#xff1a;垂直领域的智能化落地 1. 商业领域&#xff1a;智能推荐与客服 2. 工业领域&#xff1a;质检与流程优化 3. 智慧城市与医…...

DockerFile优化镜像体积

title: DockerFile优化镜像体积 date: 2025-02-15 15:22:40 tags: DockerFile优化镜像体积DockerFile优化镜像体积 DockerFile优化镜像体积前文回顾:一、细数优化镜像体积的思路与方式二、优化Dockfile文件编辑 Dockerfile2文件三、构建镜像四、运行镜像五、查看运行效果原文 …...

WeMos D1+PIR+Android 的小场景制作

最近在做一个有趣的小场景功能&#xff0c;其实已经有成熟产品&#xff0c;但是考虑到没法实现场景扩展&#xff0c;所以自己开始动手做。 场景描述&#xff1a;玄关人体感应&#xff0c;有人进门&#xff0c;致欢迎词&#xff0c;有人离开&#xff0c;致欢送词。 硬件设备&a…...

实现pytorch注意力机制-one demo

主要组成部分&#xff1a; 1. 定义注意力层&#xff1a; 定义一个Attention_Layer类&#xff0c;接受两个参数&#xff1a;hidden_dim&#xff08;隐藏层维度&#xff09;和is_bi_rnn&#xff08;是否是双向RNN&#xff09;。 2. 定义前向传播&#xff1a; 定义了注意力层的…...

使用循环队列来接收串口信息--以stm32f103为例

一、引言 在stm32中&#xff0c;一般采用的是通过数组来接收串口信息&#xff0c;但是由于受到数组大小的限制&#xff0c;易出现数据覆盖或者数据溢出问题。针对上述问题&#xff0c;采用循环队列的方式来接收串口信息&#xff0c;循环队列可以动态管理缓冲区并且当队列满时&a…...

代码随想录D50-51 图论 Python

理论基础 理论基础部分依然沿用代码随想录教程中的介绍&#xff1a; 图的种类 度 连通性 连通性用于表示图中节点的连通情况。 如果有节点不能到达其他节点&#xff0c;则为非连通图&#xff0c;想象将多个水分子表示为图&#xff0c;不考虑非键作用&#xff0c;这张图就不是…...

大幂计算和大阶乘计算【C语言】

大幂计算&#xff1a; #include<stdio.h> long long int c[1000000]{0}; int main() {long long a,b,x1;c[0]1;printf("请输入底数&#xff1a;");scanf("%lld",&a);printf("请输入指数&#xff1a;");scanf("%lld",&b…...

段错误 (核心已转储)

struct Addressbooks {struct Person personArray[MAX];int m_Size; // 当前已用大小 };void addPerson(Addressbooks *abs) {// 开始添加操作string name;cout << "输入姓名&#xff1a;";cin >> name;// 下面这句话执行后就报&#xff1a;段错误 (核心…...

Leetcode 227-基本计算器 II

题解 本题不包含括号&#xff0c;比较简单 双栈法&#xff08;运算符栈数字栈&#xff09; 对于「任何表达式」而言&#xff0c;可以都使用两个栈 nums 和 ops&#xff08;本题只用到了nums&#xff09;&#xff1a; nums &#xff1a; 存放所有的数字 ops &#xff1a;存放…...

springcloudalibaba组件gateway

Spring Cloud Alibaba 组件中的 Gateway 是一个基于 Spring Cloud Gateway 实现的 API 网关&#xff0c;它专为微服务架构提供简单且有效的 API 路由管理方式。以下是对 Spring Cloud Alibaba Gateway 的详细介绍&#xff1a; 一、基本概念 API 网关&#xff1a;作为系统的统…...

MongoDB副本集

副本集架构 对于mongodb来说&#xff0c;数据库高可用是通过副本集架构实现的&#xff0c;一个副本集由一个主节点和若干个从节点所组成。 客户端通过数据库主节点写入数据后&#xff0c;由从节点进行复制同步&#xff0c;这样所有从节点都会拥有这些业务数据的副本&#xff0…...

LeetCode-680. 验证回文串 II

1、题目描述&#xff1a; 给你一个字符串 s&#xff0c;最多 可以从中删除一个字符。 请你判断 s 是否能成为回文字符串&#xff1a;如果能&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;s "aba" 输出&a…...

国产编辑器EverEdit - “切换文件类型”的使用场景

1 “切换文件类型”的使用场景 1.1 应用背景 一般的编辑器都是通过扩展名映射到对应的语法高亮规则的&#xff0c;比如&#xff1a;文件test.xml中的扩展名“xml"对应XML的语法高亮&#xff0c;在编辑器中打开test.xml就会给不同标识符显示不同的颜色。 但有时一些应用程…...

AIP-146 泛化域

编号146原文链接AIP-146: Generic fields状态批准创建日期2019-05-28更新日期2019-05-28 API中的大多数域&#xff0c;无论是在请求、资源还是自定义应答中&#xff0c;都有具体的类型或模式。这个模式是约定的一部分&#xff0c;开发者依此约定进行编码。 然而&#xff0c;偶…...

C++11 thread

文章目录 C11 线程库线程对象的构造方式无参的构造函数调用带参的构造函数调用移动构造函数thread常用成员函数 this_thread命名空间join && detachmutex C11 线程库 线程对象的构造方式 无参的构造函数 1、调用无参的构造函数,调用无参的构造函数创建出来的线程对象…...

重生之我在异世界学编程之C语言:深入预处理篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、预处理的作用与流程&#xf…...

Java并发编程5--Java内存模型的基础

1.并发编程模型的两个关键问题 在并发编程中&#xff0c;需要处理两个关键问题&#xff1a;线程之间如何通信及线程之间如何同步&#xff08;这里的线程是指并发执行的活动实体&#xff09;。 通信是指线程之间以何种机制来交换信息。 在命令式编程中&#xff0c;线程之间的通…...

国密算法SM1、SM2、SM3和SM4 具体的使用和区别

国密算法是中国自主研发的密码算法&#xff0c;包括SM1、SM2、SM3和SM4&#xff0c;分别用于不同场景。以下是它们的具体使用和区别&#xff1a; SM1 对称加密算法 类型: 对称加密 密钥长度: 128位 使用场景: 用于数据加密和解密&#xff0c;适用于金融、政务等领域。 特点: …...

package.json的全面详解

在 Node.js 的世界里&#xff0c;package.json 文件占据着举足轻重的地位。它就像项目的“大脑”&#xff0c;掌控着项目的各种信息和依赖管理。下面&#xff0c;我们就深入剖析 package.json 文件&#xff0c;让你全面了解它的奥秘。 一、创建 package.json 在正式开始使用 …...

Linux、Docker与Redis核心知识点与常用命令速查手册

Linux、Docker与Redis核心知识点与常用命令速查手册 一、Linux基础核心 1. 核心概念 文件系统&#xff1a;采用树形结构&#xff0c;根目录为/权限机制&#xff1a;rwx&#xff08;读/写/执行&#xff09;权限&#xff0c;用户分为owner/group/others软件包管理&#xff1a; …...