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

设计模式七大原则

在软件开发的广袤领域中,设计模式如同熠熠生辉的灯塔,为开发者指引着通往高效、可维护、可扩展软件系统的方向。而设计模式背后的七大原则,更是这些灯塔的核心支撑,它们是软件开发过程中必须遵循的黄金法则,为我们构建高质量的软件架构奠定了坚实基础。本文将深入剖析这七大原则,带您领略其深刻内涵与实际应用。

一、单一职责原则(Single Responsibility Principle, SRP)

2.1 原则定义

一个类应该仅有一个引起它变化的原因,即一个类应该只负责一项职责。

2.2 示例分析

以一个简单的用户管理系统为例,假设我们有一个 UserService 类,它既负责用户信息的存储(如将用户数据写入数据库),又负责用户信息的验证(如验证用户名是否合法、密码强度是否符合要求)。当数据库存储方式发生变化时,UserService 类需要修改;当用户验证规则改变时,UserService 类同样需要修改。这就违背了单一职责原则。

按照单一职责原则,我们应该将其拆分为两个类:UserStorageService 负责用户信息的存储操作,UserValidationService 负责用户信息的验证操作。这样,当某一项职责发生变化时,只需要修改对应的类,而不会影响到其他职责相关的代码。

2.3 优势

  • 提高可维护性:当一个类只负责一项职责时,代码逻辑更加清晰,修改某个功能时不容易影响到其他功能,从而降低维护成本。
  • 增强可扩展性:如果需要增加新的职责,只需要创建新的类来承担该职责,而不需要对现有类进行大规模修改。

二、开闭原则(Open - Closed Principle, OCP)

3.1 原则定义

软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。即当软件需要变化时,我们应该通过扩展代码来实现变化,而不是修改现有的代码。

3.2 示例分析

假设我们正在开发一个图形绘制系统,目前有一个 Shape 类和一个 DrawShapes 类。Shape 类是所有图形类的基类,DrawShapes 类负责绘制各种形状。最初系统只有圆形(Circle)和矩形(Rectangle)两种图形。

// 基类Shape
class Shape {public void draw() {// 空实现,具体图形类实现}
}// 圆形类
class Circle extends Shape {@Overridepublic void draw() {System.out.println("绘制圆形");}
}// 矩形类
class Rectangle extends Shape {@Overridepublic void draw() {System.out.println("绘制矩形");}
}// 绘制图形类
class DrawShapes {public void drawAllShapes(Shape[] shapes) {for (Shape shape : shapes) {shape.draw();}}
}

当我们需要添加新的图形(如三角形 Triangle)时,按照开闭原则,我们不需要修改 DrawShapes 类的代码,只需要创建 Triangle 类继承自 Shape 类,并实现 draw 方法即可。

// 三角形类
class Triangle extends Shape {@Overridepublic void draw() {System.out.println("绘制三角形");}
}

3.3 优势

  • 降低风险:避免修改现有代码可能引入的新 bug,因为修改现有代码可能会影响到已经测试通过的功能。
  • 提高可维护性和可扩展性:通过扩展新的类来实现功能的增加,使得软件系统更加灵活,易于维护和扩展。

三、里氏替换原则(Liskov Substitution Principle, LSP)

4.1 原则定义

所有引用基类(父类)的地方必须能透明地使用其子类的对象。这意味着子类对象必须能够替换掉它们的父类对象,而程序的行为不会发生任何异常或错误。

4.2 示例分析

假设有一个鸟类 Bird,它有一个 fly 方法表示飞行。现在有两个子类 Sparrow(麻雀)和 Ostrich(鸵鸟),如果简单地继承 Bird 类,鸵鸟虽然继承了 fly 方法,但实际上鸵鸟并不会飞。这就违背了里氏替换原则。

正确的做法是,重新审视类的设计,将 Bird 类中 fly 方法提取到一个接口 Flyable 中,让 Sparrow 类实现 Flyable 接口,而 Ostrich 类不实现 Flyable 接口,这样就符合里氏替换原则。

// 飞行接口
interface Flyable {void fly();
}// 鸟类
class Bird {// 鸟类的其他通用属性和方法
}// 麻雀类
class Sparrow extends Bird implements Flyable {@Overridepublic void fly() {System.out.println("麻雀飞行");}
}// 鸵鸟类
class Ostrich extends Bird {// 鸵鸟的特有属性和方法
}

4.3 优势

  • 保证继承体系的稳定性:遵循里氏替换原则,能确保子类在替换父类时不会破坏原有程序的正确性,使得继承体系更加健壮。
  • 提高代码的可复用性和可维护性:基于里氏替换原则设计的代码,父类和子类之间的关系更加清晰,代码复用性更高,维护起来也更加容易。

四、依赖倒置原则(Dependency Inversion Principle, DIP)

5.1 原则定义

  • 高层模块不应该依赖低层模块,二者都应该依赖其抽象。
  • 抽象不应该依赖细节,细节应该依赖抽象。

5.2 示例分析

假设我们有一个高层模块 CustomerService(客户服务类),它需要调用低层模块 Database(数据库操作类)来获取客户信息。如果 CustomerService 直接依赖于 Database 类,那么当数据库操作方式发生变化时,CustomerService 类也需要进行修改。

按照依赖倒置原则,我们可以定义一个抽象接口 ICustomerDataAccessDatabase 类实现这个接口,CustomerService 类依赖于 ICustomerDataAccess 接口。

// 客户数据访问接口
interface ICustomerDataAccess {String getCustomerInfo();
}// 数据库操作类实现接口
class Database implements ICustomerDataAccess {@Overridepublic String getCustomerInfo() {// 从数据库获取客户信息的具体实现return "客户信息";}
}// 客户服务类依赖接口
class CustomerService {private ICustomerDataAccess dataAccess;public CustomerService(ICustomerDataAccess dataAccess) {this.dataAccess = dataAccess;}public String getCustomer() {return dataAccess.getCustomerInfo();}
}

5.3 优势

  • 提高系统的灵活性和可维护性:通过依赖抽象,当底层实现发生变化时,只需要替换实现抽象接口的类,而不需要修改高层模块的代码,从而提高了系统的灵活性和可维护性。
  • 降低模块间的耦合度:高层模块和低层模块之间通过抽象接口进行交互,降低了它们之间的直接耦合,使得各个模块可以独立开发、测试和维护。

五、接口隔离原则(Interface Segregation Principle, ISP)

6.1 原则定义

客户端不应该被迫依赖于它不使用的接口。即一个类对另一个类的依赖应该建立在最小的接口上。

6.2 示例分析

假设我们有一个接口 AnimalActions,它包含了 eat(吃)、fly(飞)、swim(游泳)等方法。现在有两个类 Dog 和 EagleDog 类只需要实现 eat 方法,Eagle 类需要实现 eat 和 fly 方法。如果 Dog 和 Eagle 类都实现 AnimalActions 接口,那么 Dog 类就被迫依赖于它不需要的 fly 和 swim 方法,这违背了接口隔离原则。

我们应该将 AnimalActions 接口拆分为多个小接口,如 IEatIFlyISwim,让 Dog 类实现 IEat 接口,Eagle 类实现 IEat 和 IFly 接口。

// 吃接口
interface IEat {void eat();
}// 飞接口
interface IFly {void fly();
}// 狗类实现吃接口
class Dog implements IEat {@Overridepublic void eat() {System.out.println("狗吃东西");}
}// 鹰类实现吃和飞接口
class Eagle implements IEat, IFly {@Overridepublic void eat() {System.out.println("鹰吃东西");}@Overridepublic void fly() {System.out.println("鹰飞行");}
}

6.3 优势

  • 降低类的复杂度:避免类实现过多不需要的接口方法,使得类的职责更加明确,代码更加简洁。
  • 提高系统的灵活性和可维护性:当接口需求发生变化时,只需要修改相关的小接口,而不会影响到其他不相关的类,从而提高了系统的灵活性和可维护性。

六、迪米特法则(Law of Demeter, LoD)

7.1 原则定义

一个对象应该对其他对象有尽可能少的了解,即 “只和你的直接朋友交谈,不跟‘陌生人’说话”。这里的 “直接朋友” 是指:出现在成员变量、方法的输入输出参数中的类。

7.2 示例分析

假设我们有一个学校系统,有 School 类、Class 类和 Student 类。School 类包含多个 Class 类对象,Class 类包含多个 Student 类对象。如果 School 类直接获取某个 Class 类中的某个 Student 类对象的信息,这就违背了迪米特法则,因为 Student 类对于 School 类来说是 “陌生人”。

正确的做法是,School 类通过 Class 类来间接获取 Student 类的信息,Class 类是 School 类的 “直接朋友”。

class Student {private String name;public Student(String name) {this.name = name;}public String getName() {return name;}
}class Class {private Student[] students;public Class(Student[] students) {this.students = students;}public Student getStudent(int index) {return students[index];}
}class School {private Class[] classes;public School(Class[] classes) {this.classes = classes;}public String getStudentName(int classIndex, int studentIndex) {Class classObj = classes[classIndex];Student student = classObj.getStudent(studentIndex);return student.getName();}
}

7.3 优势

  • 降低系统的耦合度:减少对象之间不必要的依赖,使得各个模块之间的联系更加松散,从而降低系统的耦合度。
  • 提高系统的可维护性和可扩展性:当某个模块发生变化时,由于其与其他模块的耦合度低,对其他模块的影响也较小,便于系统的维护和扩展。

 

结语

掌握设计模式七大原则,能帮你构建稳健、易维护的软件架构,提升开发效率与软件质量。希望本文能助你更好运用这些原则。若有疑问或想深入探讨,欢迎留言!

相关文章:

设计模式七大原则

在软件开发的广袤领域中,设计模式如同熠熠生辉的灯塔,为开发者指引着通往高效、可维护、可扩展软件系统的方向。而设计模式背后的七大原则,更是这些灯塔的核心支撑,它们是软件开发过程中必须遵循的黄金法则,为我们构建…...

重庆市大数据局:基于可信数据空间的公共数据流通利用

在2024年可信数据空间论坛上,重庆市大数据局相关领导发表了题为:基于可信数据空间的公共数据流通利用的演讲,系统介绍了重庆公共数据流通方面的实践经验和案例。 篇幅限制,部分内容如下:...

高阶数据结构----布隆过滤器和位图

(一)位图 位图是用来存放某种状态的,因为一个bit上只能存0和1所以一般只有两种状态的情况下适合用位图,所以非常适合判断数据在或者不在,而且位图十分节省空间,很适合于海量数据,且容易存储&…...

SpringCloud源码分析-nacos与eureka

一、高版本为什么优先用nacos 如果用alibaba springcloud,那么就是阿里的技术体系。nacos属于阿里的原生技术栈,所以阿里更偏向于用nacos作为服务发现注册。 二、对比分析 Spring Cloud Alibaba 推荐使用 Nacos 作为服务发现和配置管理的首选组件&…...

多台DHCP服务器时的问题讨论

有两台DHCP服务器为主机提供DHCP服务会发生什么 在一个网络中,如果有两台设备同时连接到主机,并且它们都可以提供 DHCP 服务,这可能会引发以下问题: 1. IP 地址冲突 当两台设备都扮演 DHCP 服务器时,它们会分别为主…...

Golang的缓存一致性策略

Golang的缓存一致性策略 一致性哈希算法 在Golang中,缓存一致性策略通常使用一致性哈希算法来实现。一致性哈希算法能够有效地解决缓存节点的动态扩容、缩容时数据重新分布的问题,同时能够保证数据访问的均衡性。 一致性哈希算法的核心思想是将节点的哈希…...

Java-创建一个结合CompletableFuture和自定义功能的工具类

1.重试机制:当异步任务失败时自动重试。 2.超时重试:在指定时间内未完成的任务进行重试。 3.批量处理:将多个任务批量执行并收集结果。 4.日志记录:为每个异步任务添加日志记录,便于调试和监控。 5.自定义线程池:允许用户传入自定义的线程池配置。 import java.util…...

微机——计算机中的数制

目录 数制转换: 十进制数转为非十进制数: 二、八、十六进制数之间的转换: 数及字符的表示: 二进制数的加减运算: 无符号数的运算: 带符号数运算中的溢出问题: 计算机中常用的编码&#…...

DevSecOps自动化在安全关键型软件开发中的实践、Helix QAC Klocwork等SAST工具应用

DevSecOps自动化对于安全关键型软件开发至关重要。 那么,什么是DevSecOps自动化?具有哪些优势?为何助力安全关键型软件开发?让我们一起来深入了解~ 什么是DevSecOps自动化? DevSecOps自动化是指在软件开发生命周期的各…...

Linux下部署ElasticSearch集群

Elasticsearch7.17.8集群的搭建 节点host名称节点ip节点部署内容k8s-m192.168.40.142主节点 数据节点k8s-w1192.168.40.141主节点 数据节点k8s-w2192.168.40.140数据节点 一、准备安装环境 1.下载安装包 官网 www.elastic.co 下载所有版本地址 点击跳转 下载elasticsearch-7.…...

杰盛微 JSM4056 1000mA单节锂电池充电器芯片 ESOP8封装

JSM4056 1000mA单节锂电池充电器芯片 JSM4056是一款单节锂离子电池恒流/恒压线性充电器,简单的外部应用电路非常适合便携式设备应用,适合USB电源和适配器电源工作,内部采用防倒充电路,不需要外部隔离二极管。热反馈可对充电电流进…...

kubernetes学习-kubectl命令、探针(二)

一、在任意节点使用 kubectl # 在master节点获取节点信息 [rootk8s-master k8s]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 16h v1.23.6 k8s-node1 Ready <none> …...

多组学破解雪域雄鸡的高原缺氧适应机制

藏鸡‌是一种原产于中国青藏高原的鸡种&#xff0c;主要分布在海拔2200-4100米的河谷区和高山峡谷区。它们适应高海拔和寒冷的气候条件&#xff0c;能够在恶劣的环境中生存和繁殖‌。本研究主要关注高原藏鸡适应高原缺氧环境的机制&#xff0c;通过宏转录组测序和代谢组结果的联…...

Kubernetes Gateway API-3-TLS配置

1 简介 Gateway API 允许使用多种方式配置 TLS。本文档列出了各种TLS设置,并给出了如何有效使用它们的一般指南。 尽管本文档涵盖了 Gateway API 最常见的TLS配置形式,但某些实现也可能提供特定于实现的扩展,允许不同或更高级形式的TLS配置。除此文档外,值得阅读你所使用…...

C++ 中如何优雅地返回一个递归闭包函数?

在刷Leetcode时&#xff0c;我遇到了一道题目&#xff08;详见Leetcode 第426场周赛分析总结Q3&#xff09;&#xff0c;需要对两棵树建图&#xff0c;然后以每个节点作为根节点进行DFS遍历。一般的实现方法是将重复的逻辑封装起来&#xff0c;写两个函数&#xff0c;一个负责建…...

dockerignore文件怎么写

.dockerignore 文件是一个文本文件&#xff0c;告诉 Docker 在构建镜像时应该忽略哪些文件或目录。这个文件的作用类似于 .gitignore&#xff0c;用于排除不需要包含在 Docker 镜像中的文件或目录&#xff0c;以减少镜像的大小和提高构建速度。 .dockerignore 文件的格式 每行…...

利用 AI 高效生成思维导图的简单实用方法

#工作记录 适用于不支持直接生成思维导图的AI工具&#xff1b;适用于AI生成后不能再次编辑的思维导图。 在日常的学习、工作以及知识整理过程中&#xff0c;思维导图是一种非常实用的工具&#xff0c;能够帮助我们清晰地梳理思路、归纳要点。而借助 AI 的强大能力&#xff0c…...

SpringMVC(一)配置

目录 引入 第一章&#xff1a;Java web的发展历史 一、Model I和Model II 1.Model I开发模式 2.Model II开发模式 二. MVC模式 第二章&#xff1a;SpringMVC的入门案例 搭建SpringMVC的入门程序 1.创建新项目 2.等待加载导入坐标 3.处理xml文件和其他 导入tomcat 运…...

Vue3苦逼的学习之路

从一名测试转战到全栈是否可以自学做到&#xff0c;很多朋友肯定会说不可能&#xff0c;或就算转了也是个一般水平&#xff0c;我很认同&#xff0c;毕竟没有经过各种项目的摧残&#xff0c;但是还是得踏足一下这个领域。所以今天和大家分享vue3中的相关内容&#xff0c;大佬勿…...

github提交不上去,网络超时问题解决

问题出现的原因&#xff1a; DNS服务器数据不同步&#xff0c;github的服务器发送迁移&#xff0c;在本地缓存的ip地址现在无效了。 解决方案&#xff1a; 1&#xff09;点击这里&#xff0c;查询github.com最新的ip地址 2.0&#xff09;编辑linux系统地址缓存文件&#x…...

SAP物料主数据界面增加客制化字段、客制化页签的方式

文章目录 前言一、不增加页签&#xff0c;只增加客制化字段二、增加物料主数据页签 前言 【SAP系统MM模块研究】 #SAP #MM #物料 #客制化 #物料主数据 项目上难免会遇到客户要在物料主数据的界面上&#xff0c;增加新字段的需求。 实现方式有&#xff1a; &#xff08;1&…...

56.在 Vue 3 中使用 OpenLayers 通过 moveend 事件获取地图左上和右下的坐标信息

前言 在现代 Web 开发中&#xff0c;地图应用越来越成为重要的组成部分。OpenLayers 是一个功能强大的 JavaScript 地图库&#xff0c;它提供了丰富的地图交互和操作功能&#xff0c;而 Vue 3 是当前流行的前端框架之一。在本篇文章中&#xff0c;我们将介绍如何在 Vue 3 中集…...

DDoS攻击防御方案大全

1. 引言 随着互联网的迅猛发展&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;攻击成为了网络安全领域中最常见且危害严重的攻击方式之一。DDoS攻击通过向目标网络或服务发送大量流量&#xff0c;导致服务器过载&#xff0c;最终使其无法响应合法用户的请求。本文将深…...

OLED的显示

一、I2C I2C时序&#xff1a;时钟线SCL高电平下&#xff1a;SDA由高变低代表启动信号&#xff0c;开始发送数据&#xff1b;SCL高电平时&#xff0c;数据稳定&#xff0c;数据可以被读走&#xff0c;开始进行读操作&#xff0c;SCL低电平时&#xff0c;数据发生改变&#xff1…...

BP神经网络的反向传播算法

BP神经网络&#xff08;Backpropagation Neural Network&#xff09;是一种常用的多层前馈神经网络&#xff0c;通过反向传播算法进行训练。反向传播算法的核心思想是通过计算损失函数对每个权重的偏导数&#xff0c;从而调整权重&#xff0c;使得网络的预测输出与真实输出之间…...

CS·GO搬砖流程详细版

说简单点&#xff0c;就是Steam买了然后BUFF上卖&#xff0c;或许大家都知道这点&#xff0c;但就是一些操作和细节问题没那么明白。我相信&#xff0c;你看完这篇文章以后&#xff0c;至少会有新的认知。 好吧&#xff0c;废话少说&#xff0c;直接上实操&#xff01; 首先准…...

ElasticSearch系列(一)

一.了解ES、倒排索引、es的一些概念、安装es、kibana 二.DSL&#xff1b;索引库操作 三.Java RestClient&#xff1a;索引库操作 一、了解ES、倒排索引、es的一些概念、安装es、kibana kibana、logstash、beats Elasticserach 存储&#xff0c;计算 &#xff0c;搜索数据 –…...

vue字符串的数字比较大小有问题

问题代码 this.money 9999 //支付金额this.balance 678 //余额if (this.money > this.balance) {this.$message(余额不足&#xff0c;请更换支付方式);}问题原因 this.money和 this.balance不是数值类型而是字符串类型 解决方案 使用parseFloat将变量转换成统一的类…...

Java:缓存:LinkedHashMap实现Lru

文章目录 Lru源码分析 ​​​​​​​​​​​​​​LinkedHashMap维护一个LinkedHashMapEntry<K,V>的双向链表对LinkedHashMap的增删查操作,也会对链表进行相同的操作并改变链表的链接顺序小结使用方法​​​​​​​​​​​​​​应用总结Lru Least Recently Used,…...

Jetpack Compose 学习笔记(一)—— 快速上手

本篇主要是对 Jetpack Compose 有一个宏观上的了解。 1、Jetpack Compose 是什么与优势 Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API&#xff0c;可以帮助您简化并加快 Android 界面开发。 Compose 的优势&am…...

【大模型】7 天 AI 大模型学习

7 天 AI 大模型学习 Day 2 今天是 7 天AI 大模型学习的第二天 &#x1f604;&#xff0c;今天我将会学习 Transformer 、Encoder-based and Decoder-Based LLMs 等 。如果有感兴趣的&#xff0c;就和我一起开始吧 &#xff5e; 课程链接 &#xff1a;2025年快速吃透AI大模型&am…...

JVM对象创建过程

1 类加载检查 jvm通过new指令开始创建对象jvm执行new指令时&#xff0c;首先通过指令参数从常量池中取到需要创建的类名检查该类是否被加载&#xff0c;解析&#xff0c;和初始化过如果没有&#xff0c;则执行类的加载过程new指令对应到java语言具体的操作为 new 关键字创建对象…...

OSPF - SPF算法简述

SPF全称最短路径树算法&#xff0c;相信学过数据结构朋友应该看起来很熟悉  在一个区域内的路由器都会产生描述自己网络连接信息的LSA&#xff0c;包括两种信息&#xff0c;有路由信息和拓扑信息&#xff0c;简单的来说拓扑信息就是我连着谁&#xff0c;路由信息就是链路的地址…...

[实用指南]如何将视频从iPhone传输到iPad

概括 将视频从 iPhone 传输到 iPad 时遇到问题&#xff1f;您可能知道一种方法&#xff0c;但不知道如何操作。此外&#xff0c;您要传输的视频越大&#xff0c;完成任务就越困难。那么如何将视频从 iPhone 传输到 iPad&#xff0c;特别是当您需要发送大视频文件时&#xff1f…...

如何二次封装组件(vue3版本)

在开发 Vue 项目中我们一般使用第三方组件库进行开发&#xff0c;如 Element-Plus, 但是这些组件库提供的组件并不一定满足我们的需求&#xff0c;这时我们可以通过对组件库的组件进行二次封装&#xff0c;来满足我们特殊的需求。 对于封装组件有一个大原则就是我们应该尽量保…...

基于XGBoost算法的集成学习

目录 一、XGBoost原理1.1 提升方法&#xff08;Boosting&#xff09;1.2 提升决策树 &#xff08;BDT&#xff09;1.3 梯度提升决策树 &#xff08;GBDT&#xff09;1.4 极限梯度提升&#xff08;XGBoost&#xff09;1.4.1 XGBoost改进1.4.2 XGBoostcsklearn实现1.4.3 XGBoost回…...

数据库系列之分布式数据库下误删表怎么恢复?

数据的完整性是数据库可用性的基本功能&#xff0c;在实际应用数据库变更操作过程中可能因为误操作导致误删表或者truncate操作影响业务的正常访问。本文介绍了分布式数据库中在误删表场景下的数据恢复方案&#xff0c;并进行了对比。 1、数据库误删表恢复方案 应用数据的完整…...

Beamer-LaTeX学习(教程批注版)【1】

该文档总体由beamer-latex的教程而来&#xff0c;由耳东小白以自身学习路径整理。因其中要点基本按照教程的顺序和结构整理&#xff0c;故而不能称之为完全原创&#xff0c;但也不是翻译&#xff0c;更不是抄袭&#xff0c;是个人自学笔记和批注&#xff0c;其中添加了小白个人…...

数据挖掘——关联规则挖掘

数据挖掘——关联数据挖掘 关联数据挖掘关联规则关联规则挖掘问题&#xff1a;具体挖掘过程Apriori 产生关联规则 关联数据挖掘 关联分析用于发现隐藏在大型数据集中的令人感兴趣的联系&#xff0c;所发现的模式通常用关联规则或频繁项集的形式表示。 关联规则反映一个事物与…...

六种主流服务器的选择与使用

网络的运行离不开各种服务器&#xff0c;它们各司其职&#xff0c;为我们提供稳定的网络服务。本文带大家了解6种常见服务器类型。 服务器的六大种类 第一种&#xff1a;Web服务器 Web服务器是互联网的核心。当你打开一个网站&#xff0c;比如百度或淘宝&#xff0c;浏览器会…...

springboot3 redis 常用操作工具类

在 Spring Boot 3 中&#xff0c;操作 Redis 通常使用 Spring Data Redis 提供的工具类&#xff0c;如 RedisTemplate 和 StringRedisTemplate。以下是一个详细的 Redis 操作工具类的实现&#xff0c;涵盖了常用功能。 完整的 Redis 工具类 以下工具类可以实现基本的 Redis 操…...

OJ随机链表的复制题目分析

题目内容&#xff1a; 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 分析&#xff1a; 这道题目&#xff0c;第一眼感觉非常乱&#xff0c;这是正常的&#xff0c;但是我们经过仔细分析示例明白后&#xff0c;其实也并不是那么难。现在让我们一起来分析分析…...

如何不修改模型参数来强化大语言模型 (LLM) 能力?

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 大语言模型 (Large Language Model, LLM, e.g. ChatGPT) 的参数量少则几十亿&#xff0c;多则上千亿&#xff0c;对其的训…...

Win11+WLS Ubuntu 鸿蒙开发环境搭建(二)

参考文章 penHarmony南向开发笔记&#xff08;一&#xff09;开发环境搭建 OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——标准系统移植指南&#xff08;一&#xff09; OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——小型系统芯片移植指南&#xff08;二&…...

Qemu配置QXL显卡支持分辨率

默认情况下&#xff0c;创建的vm的视频RAM限制为16MB。在win操作系统中分辨率最高就只能调到1024x768。 <video><model typecirrus vram16384 heads1 primaryyes/><address typepci domain0x0000 bus0x00 slot0x02 function0x0/> </video>单单修改ram…...

Hack The Box-Starting Point系列Three

答案 How many TCP ports are open?&#xff08;靶机开了几个TCP端口&#xff09; 2What is the domain of the email address provided in the “Contact” section of the website?&#xff08;网站的“CONTACT”部分提供的电子邮件地址的域是什么&#xff1f;&#xff09…...

人工智能-Python多任务编程-进程、线程

多任务的实现方式 多进程 多线程 1 多任务的两种表现形式 并发: 在一段时间内交替去执行多个任务&#xff08;任务数大于CPU核心数&#xff09;并行: 在一段时间内真正的同时一起执行多个任务&#xff08;任务数小于等于CPU核心数&#xff09; 2 进程 进程&#xff08;Proc…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之9 重新开始 之2

本文要点 对程序设计而言&#xff1a;前者基于一个自上而下的 分类体系--&#xff08;生物遗传基因&#xff09;&#xff0c;后者者需要一个收集差异的自下而上的差异继承路径--&#xff08;系统继承源流&#xff09; 就是 广义和狭义 分类学。 共性对齐 和 差异收集 正是两者…...

Postman[7] 内置动态参数及自定义的动态参数

postman 内置动态参数和自定义的动态参数 1.内置动态参数 格式&#xff1a;{{$参数名}} 1.1时间戳 {{$timestamp}} //生成当前时间的时间戳 1.2随机整数 {{$randomint}} //生成0-1000之间的随机数 1.3GUID字符串 {{$guid}} //生成随机GUID字符串 2.自定义动态参数 格式…...

04-c++类和对象(下)

一、友元 前面学习的类中&#xff0c;只能通过该类的公共方法访问私有数据。而如果将某个函数设置为类的友元&#xff0c;那么这个函数就可以直接访问该类的私有数据&#xff0c;破坏了类的封装性&#xff0c;只在某些特定的情况下使用。 友元的分类&#xff1a;普通全局函数…...