[设计模式]1_设计模式概览
摘要:设计模式原则、设计模式的划分与简要概括,怎么使用重构获得设计模式并改善代码的坏味道。
本篇作概览与检索用,后续结合源码进行具体模式深入学习。
目录
1、设计模式原理
核心原则(语言无关)
本质原理图
原则关联矩阵
2、设计模式分类
1. 创建型模式
2. 结构型模式
3. 行为型模式
3、重构获得模式
重构关键技法
静态——>动态
早绑定——>晚绑定
继承——>组合
编译时依赖——>运行时依赖
紧耦合——>松耦合
生产设计的原则倾向
什么样的代码算是好的代码呢?同好的服务一样(此处强行关联 《[微服务设计]1_微服务》)——功能正确、高效、可维护性强、健壮抗压、写作流畅。也可以总的来说,低耦合高内聚的高质量可维护代码,就是好的代码。
那么,有没有一些规范可以遵循的呢?
有的,设计模式就是这样的指导规范。
1、设计模式原理
核心原则(语言无关)
众所周知,设计模式有一些原则可以遵守:
单一职责:一个模块/类应仅负责一个职责。降低模块间耦合,提升可维护性。
里氏替换:所有引用基类的地方必须能透明地使用子类对象。这样利于抽象与类型封装。
开放封闭:对修改封闭、对拓展开放。
迪米特:减少对象间不必要的直接交互,降低耦合,提高模块独立性。
接口隔离原则:客户端不应依赖未使用的接口。将大接口拆分为小的、高内聚的接口。
依赖倒置:高层模块不应该依赖于底层模块,转换为二者都依赖于抽象。具体来说就是针对接口编程,而不是针对具体实现,这样可以减少各部分依赖关系,这也面向对象设计的亮点。
还有优先使用对象组合而不是类继承等等……
总的来说:从通用核心原则到实现层原则再到构造策略相关的原则,均追求代码模块的低耦合高内聚,降低复杂度。
本质原理图
原则关联矩阵
原则 | 变化控制 | 认知简化 | 系统弹性 | 典型模式 |
单一职责(SRP) | 高 | 高 | 中 | 外观模式 |
开放封闭(OCP) | 极高 | 中 | 极高 | 策略模式、 装饰器模式 |
里氏替换(LSP) | 中 | 高 | 高 | 组合模式、代理模式 |
接口隔离(ISP) | 高 | 极高 | 中 | 适配器模式、中介模式 |
依赖倒置(DIP) | 极高 | 中 | 高 | 桥接模式、依赖注入模式 |
组合优先 | 高 | 中 | 极高 | 享元模式,职责链模式 |
2、设计模式分类
Gang of Four(四人组,GOF) 在经典著作《设计模式:可复用面向对象软件的基础》中提出的23种设计模式的分类方式,按功能和用途分为三大类——创建型、结构型、行为型。
1. 创建型模式
目的:解决对象的创建问题,封装实例化逻辑,提升代码复用性和灵活性。
核心思想:将对象的创建与使用解耦,通过统一接口或模板控制对象实例化过程。
-
工厂方法 (Factory Method): 定义一个创建对象的接口,但由子类决定要实例化的类。工厂方法将类的实例化推迟到子类。
-
抽象工厂 (Abstract Factory): 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。
-
原型 (Prototype): 通过复制现有对象来创建新对象,而不是通过创建新实例。
-
建造者 (Builder): 用于构建一个复杂对象的表示。使用多个步骤构建该对象,可以将构建过程与其表示分离。
2. 结构型模式
目的:处理类与对象的组合,优化系统结构,提高模块间的解耦性。
关注如何将对象组合成更大的结构,处理类和对象的关系,以实现更大的功能。
核心思想:通过组合、继承或接口,调整类与对象的结构,增强系统的灵活性和扩展性。
-
装饰器 (Decorator): 动态地给对象添加额外的职责或行为,而不影响其他对象的功能。
-
桥接 (Bridge): 将抽象部分与其实现部分分离,使它们可以独立变化。
-
外观 (Facade): 为一组接口提供一个统一的高层接口,使得子系统更易使用。
-
代理 (Proxy): 为其他对象提供一种代理以控制对这个对象的访问。
-
中介者 (Mediator): 用于减少对象之间的通信复杂性,避免对象之间的直接引用。
-
适配器 (Adapter): 在不修改源代码的情况下,允许将不兼容的接口连接起来。
-
享元 (Flyweight): 通过共享对象来支持大量细粒度的对象,减少内存消耗。
3. 行为型模式
目的:定义对象间的通信机制,管理算法或职责的动态变化。
核心思想:通过解耦对象间的直接依赖,实现行为的动态组合、算法替换或事件驱动。
-
模板方法 (Template Method): 在一个方法中定义一个操作的整体结构,而将某些步骤的实现延迟到子类中。
-
策略 (Strategy): 定义一系列算法,将每个算法封装起来,并使它们可以互换,从而使其独立于使用它的客户端。
-
观察者/事件 (Observer/Event): 定义对象间的一对多依赖,确保当一个对象变化时,其依赖对象也会被通知并自动更新。
-
命令 (Command): 将请求封装为对象,从而允许参数化客户、队列请求以及记录请求日志。
-
访问者 (Visitor): 表示一个作用于某种对象结构中的各元素的操作,并使其可以在不改变元素类的前提下定义新的操作。
-
备忘录 (Memento): 捕获一个对象的内部状态,以便在以后恢复对象的状态,而不暴露对象的实现细节。
-
状态 (State): 让一个对象在其内部状态改变时改变其行为,对象将表现得像是它的类发生了改变。
-
组合 (Composite): 将对象组合成树形结构以表示部分-整体的层次,并使客户端对单个对象和组合对象的使用保持一致。
-
迭代器 (Iterator): 提供一种方式访问一个集合对象中的元素,而无需暴露它的内部表示。
-
责任链 (Chain of Responsibility): 将请求的发送者和接收者解耦。将多个对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它。
-
解释器 (Interpreter): 为了一种语言定义一个文法,并提供一个解释器来使用该文法。
3、重构获得模式
需要强调的是:
设计模式是循序渐进的,如同架构设计一样,没有一步到位的设计模式,也少有单一的设计模式,要掌握应用时间、地点。
应对变化,提高复用,寻找变化点。
设计模式应在变化点处应用:设计模式是对动态变化点的设计,在变化、稳定中寻找隔离点,来分离他们,从而管理变化,以稳控变。
没有一个稳定的点,设计模式就没有意义。
设计模式有23种,慢慢理解嘛。
重构关键技法
在《重构-改善既有代码的设计》一书中,作者Martin Fowler有提到一些有效的重构手法,重构时遵守设计原则。
坏味道 | 重构手法 |
重复代码(Duplicated Code) | 提炼函数、参数化、提取类。 |
过长函数(Long Method) | 提炼函数、内联临时变量。 |
过大类(Large Class) | 提炼类、搬移函数/字段。 |
数据泥团(Data Clumps) | 封装为独立类。 |
条件逻辑复杂(Switch/If) | 以多态取代条件、引入策略模式。 |
被拒绝的遗赠 | 函数下移、以委托取代子类。 |
冗余注释(Comments) | 通过代码重构让注释多余(如提炼函数明确意图)。 |
技法对应原则如下:
静态——>动态
更好地适应变化与减少重复代码:动态结构可以通过配置或者接口灵活调整,可以服用逻辑,避免静态编码导致的重复。
设计模式:
如策略模式(通过接口定义算法族,运行时选择具体策略)、观察者模式(事件驱动的动态通知机制)
重构手法:
替换条件分支为多态(如将if-else替换为不同子类实现)。
引入参数化配置(如通过配置文件动态加载行为)。
示例如下:
// 静态:硬编码的条件判断
public void calculateTax(double income) {if (country == "USA") {// 美国税率逻辑} else if (country == "China") {// 中国税率逻辑}
}// 动态:使用策略模式
interface TaxStrategy {double calculate(double income);
}
class USATax implements TaxStrategy { ... }
class ChinaTax implements TaxStrategy { ... }public void calculateTax(TaxStrategy strategy, double income) {return strategy.calculate(income);
}
早绑定——>晚绑定
通过接口和运行时决策增强灵活性。
定义与背景
-
早绑定:在编译时确定对象类型和方法调用(如直接调用具体类的方法)。
-
晚绑定:在运行时动态确定对象类型和方法调用(如通过接口或多态)。
为什么需要转向晚绑定?
-
灵活性:允许在运行时替换实现,支持扩展和插件化。
-
解耦:调用者无需依赖具体实现类,仅依赖抽象接口。
如何实现?
-
面向接口编程:定义接口,由子类实现不同行为。
-
多态与虚函数:通过基类指针/引用调用虚方法。
-
依赖注入:通过外部配置或工厂动态注入对象。
// 早绑定:直接依赖具体类
public void sendEmail(Email email) {EmailSender sender = new GmailSender();sender.send(email);
}// 晚绑定:通过接口实现多态
public interface EmailSender {void send(Email email);
}
public class GmailSender implements EmailSender { ... }
public class OutlookSender implements EmailSender { ... }public void sendEmail(Email email, EmailSender sender) {sender.send(email); // 运行时决定具体实现
}
继承——>组合
用组合替代继承,避免层级过深。
定义与背景
-
继承:通过继承复用父类代码,子类与父类形成“is-a”关系。
-
组合:通过组合其他对象复用功能,形成“has-a”关系。
为什么需要转向组合?
-
减少耦合:继承导致子类与父类高度耦合,组合则通过接口或抽象类解耦。
-
避免继承树复杂化:组合允许动态替换组件,而继承的层级过深易导致维护困难。
如何实现?
-
组合复用:将功能封装为独立对象,通过字段或方法参数组合使用。
-
策略模式:通过组合不同策略对象实现不同行为。
// 继承:硬编码行为
class Animal {void move() { ... }
}
class Bird extends Animal { ... }
class Fish extends Animal { ... }// 组合:通过接口解耦
interface MovementStrategy {void move();
}
class Bird {private MovementStrategy movement;public Bird(MovementStrategy movement) {this.movement = movement;}void fly() {movement.move(); // 组合不同策略}
}
编译时依赖——>运行时依赖
将依赖关系移到运行时,提高可测试性和扩展性。
定义与背景
-
编译时依赖:依赖关系在代码中硬编码(如直接new具体类)。
-
运行时依赖:依赖关系在运行时动态注入(如通过配置或工厂)。
为什么需要转向运行时依赖?
-
可测试性:便于通过模拟对象(Mock)进行单元测试。
-
灵活性:可替换依赖实现,无需修改代码。
如何实现?
-
依赖注入(DI):通过构造函数、方法或字段注入依赖对象。
-
工厂模式:通过工厂类动态创建对象。
// 编译时依赖:硬编码依赖
class Service {private Database database = new MySQLDatabase();void doWork() {database.query();}
}// 运行时依赖:通过构造函数注入
class Service {private Database database;public Service(Database database) {this.database = database; // 运行时注入}void doWork() {database.query();}
}
紧耦合——>松耦合
通过抽象接口和事件机制降低模块间依赖。
定义与背景
-
紧耦合:类之间直接依赖具体实现,修改一个类可能影响多个类。
-
松耦合:通过抽象接口或事件机制降低依赖,仅依赖抽象。
为什么需要转向松耦合?
-
可维护性:降低修改代码的风险,模块独立。
-
扩展性:新增功能无需修改现有代码(开闭原则)。
如何实现?
-
接口与抽象类:定义抽象接口,类仅依赖接口。
-
观察者模式:通过事件机制解耦对象间的直接通信。
-
发布-订阅模式:对象通过中间事件总线通信。
// 紧耦合:直接调用具体类
class Button {void onClick() {Text text = new Text();text.update();}
}// 松耦合:通过接口解耦
interface Updatable {void update();
}
class Button {private Updatable listener;public Button(Updatable listener) {this.listener = listener;}void onClick() {listener.update();}
}
总结一下核心思想是动态化、低耦合高内聚、保证可读性与可维护性。
生产设计的原则倾向
低耦合、高内聚是软件设计的核心原则,但并非所有设计场景的最优先考虑的事情。
比如业务服务设计中,优先考虑组织架构所需求的迭代或者用户需求和业务目标,在架构设计中,优先考虑系统性能、可维护性。
需要依据具体场景灵活变动。
再次强调,无必要修改的“完美主义”重构,设计模式也不是最优先考虑的,优先完成,优先保证代码清晰。
相关文章:
[设计模式]1_设计模式概览
摘要:设计模式原则、设计模式的划分与简要概括,怎么使用重构获得设计模式并改善代码的坏味道。 本篇作概览与检索用,后续结合源码进行具体模式深入学习。 目录 1、设计模式原理 核心原则(语言无关) 本质原理图 原…...
Python + Qt Designer构建多界面GUI应用程序:Python如何调用多个界面文件
引言 Qt Designer是一个用户友好的图形用户界面设计工具,它可以帮助开发人员通过拖放的方式快速创建界面。在实际开发中,往往需要设计多个界面文件,并在Python代码中进行统一管理和使用。本文将介绍如何在Python中使用Qt Designer设计好的多…...
AGI大模型(7):提示词应用
1 生成数据 LLM具有⽣成连贯⽂本的强⼤能⼒。使⽤有效的提示策略可以引导模型产⽣更好、更⼀致和更真实的响应。LLMs还可以特别有⽤地⽣成数据,这对于运⾏各种实验和评估⾮常有⽤。例如,我们可以使⽤它来为情感分类器⽣成快速样本,如下所示: 提示: ⽣成10个情感分析的范…...
【倒霉bug2025】找不到vc_runtimeMinimum_x64.msi
今天是倒霉的一天,当喉咙痛到无法出门玩耍的我打开steam准备开始玩《冰封世界》时,游戏启动直接报错 在选择安装之后弹出一个经典窗口 然后在C:\ProgramData\PackageCache中找msi到位置点击确定继续报错说msi版本不对 上网一搜,找不到vc_ru…...
什么是强哈希算法pbkdf2(Password-Based Key Derivation Function)
文章目录 什么是pbkdf2使用场景 在线工具 什么是pbkdf2 维基百科:https://zh.wikipedia.org/zh-cn/PBKDF2 PBKDF2(Password-Based Key Derivation Function 2)是一种基于密码的密钥派生函数。它的主要作用是从密码和盐(salt&…...
Python 基础语法详解
一、变量和数据类型 变量 在 Python 中,变量无需声明类型,直接赋值即可。变量名区分大小写。 # 整数类型 age 25 print(age) # 输出:25# 浮点数类型 height 1.75 print(height) # 输出:1.75# 字符串类型 name "张三&…...
AI Agent 时代开幕-Manus AI与OpenAI Agent SDK掀起新风暴
【本周AI新闻: AI Agent 时代开幕-Manus AI与OpenAI Agent SDK掀起新风暴】 https://www.bilibili.com/video/BV1bkQyYCEvQ/?share_sourcecopy_web&vd_source32ed33e1165d68429b2e2eb4749f3f26 最近AI圈子里最火的话题非Manus莫属!这款由中国武汉创业公司“蝴…...
为什么会出现redis数据库?redis是什么?
什么是 Redis? 为什么要用 Redis? 下面我将从 Redis 出现的背景、Redis 的解决方案个来回答。 1、Redis 出现的背景 互联网的应用越来越多,例如社交网络、电商、实时服务发展的十分迅速,这就导致了传统技术栈(如关系型数据库)…...
每日一题---dd爱框框(Java中输入数据过多)
dd爱框框 实例: 输入: 10 20 1 1 6 10 9 3 3 5 3 7 输出: 3 5 这道题要解决Java中输入的数过多时,时间不足的的问题。 应用这个输入模板即可解决: Java中输入大量数据 import java.util.*; import java.io.*;pu…...
Flink-学习路线
最近想学习一下Flink,公司的实时需求还是不少的,因此结合ai整理了一份学习路线,记录一下。 当然,公司也有Scala版本Flink框架,也学习了一下。这里只说Java版本 1. Java基础 目标: 掌握Java编程语言的基础知识。 内容…...
一次Milvus迁移的记录
前言 希望把Linux上生产环境中使用docker compose运行的milvus迁移到本地(mac os)的docker compose中 操作过程 找到了官方有两个相关的项目: https://github.com/zilliztech/milvus-backup https://github.com/zilliztech/vts 但是…我都没用,因为使…...
矩阵的转置
对于的矩阵,使用两个指针变量,可以方便实现(i,j)处元素与(j,i)处元素交换位置。令指针Arow&A[i][0],则Arow[j]可实现对第i行j列元素的访问。令指针Bptr&A[0][i],则*Bptr就可以访问(0,i)处元素,然后,…...
使用 VLOOKUP 和条件格式在 Excel 中查找并标红匹配的串号
使用 VLOOKUP 和条件格式在 Excel 中查找并标红匹配的串号 你的步骤非常详细且清晰,能够帮助用户在 Excel 中通过 VLOOKUP 和条件格式来查找并标红匹配的串号。以下是对你提供的步骤的简要总结和补充说明: 1. 添加“是否匹配”列 在 a.xlsx 中新增一列…...
Python Matplotlib面试题精选及参考答案
目录 绘制函数 y=2x+5 在区间 [1,10] 的折线图,设置标题和坐标轴标签 在同一图中绘制 sin (x) 和 cos (x) 曲线,添加图例和网格线(x∈[0,2π]) 绘制分段函数:当 x<0 时 y=0,x≥0 时 y=x,设置不同线段颜色 绘制带数据点的折线图,使用红色虚线样式和圆形标记(数据…...
在线 SQL 转 SQLAlchemy:一键生成 Python 数据模型
一款高效的在线 SQL 转 SQLAlchemy 工具,支持自动解析 SQL 语句并生成 Python SQLAlchemy 模型代码,适用于数据库管理、后端开发和 ORM 结构映射。无需手写 SQLAlchemy 模型,一键转换 SQL 结构,提升开发效率,简化数据库…...
基于自定义线程池手写一个异步任务管理器
我们在后端执行某些耗时逻辑操作时往往会导致长时间的线程阻塞,在这种情况之下,我们往往会引一条异步线程去处理这些异步任务,如果每次都创建新的线程来处理这些任务,不仅会增加代码冗余,还可能造成线程管理混乱&#…...
基恩士PLC编程小技巧八:脚本过长如何实现换行及替换
基恩士PLC编程小技巧八:脚本过长如何实现换行? 一、问题点 我们在使用基恩士编程软件KV STUDIO 进行脚本编程时,经常遇到这样的问题:脚本的一行过长,程序不好阅读及维护。 IF MR1000 OR MR1001 OR MR1002 OR MR1003 OR…...
每日一题---数组中两个字符串的最小距离
数组中两个字符串的最小距离 给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。 链接:数组中两个字符串的最小距离__牛…...
【PTA题目解答】7-1利用STL比较数据大小并排序(15分)c++
1.题目: 2.算法原理 根据题目要求,模拟即可,set容器会帮我们把插入的数自动排序好 题目说输入非整型数据就停止,不用特意判断输入的数据是整型还是非整型,如果用户输入的是字符(例如 a)&#…...
如何用Deepseek制作流程图?
使用Deepseek制作流程图,本质上是让AI根据你的需求,生成相关流程图的代码,然后在流程图编辑器中渲染,类似于Python一样,ChatGPT可以生成代码,但仍需在IDE中执行。 你知道绘制流程图最高效的工具是什么吗&a…...
【09】单片机编程核心技巧:变量赋值,从定义到存储的底层逻辑
【09】单片机编程核心技巧:变量赋值,从定义到存储的底层逻辑 🌟 核心概念 单片机变量的定义与赋值是程序设计的基础,其本质是通过 RAM(随机存储器) 和 ROM(只读存储器) 的协作实现…...
vscode python相对路径的问题
vscode python相对路径的问题 最近使用使用vscode连接wsl2写python时,经常遇到找不到包中的方法的问题,最终发现vscode在执行python代码时目录不是从当前python文件开始算起,而是从当前工作区的目录开始算起,比如说我打开的是/ho…...
C语言中的指针与函数
引言 在C语言编程中,指针是一个非常重要且强大的概念。它不仅帮助我们高效地管理内存,还能提升程序的灵活性和性能。而指针与函数的结合使用,是C语言中非常常见且极具挑战性的一个话题。正确理解和使用指针与函数的关系,不仅能帮助程序员提高代码质量,还能优化程序的执行…...
深度学习-服务器训练SparseDrive过程记录
1、cuda安装 1.1 卸载安装失败的cuda 参考:https://blog.csdn.net/weixin_40826634/article/details/127493809 注意:因为/usr/local/cuda-xx.x/bin/下没有卸载脚本,很可能是apt安装的,所以通过执行下面的命令删除: a…...
理解langchain langgraph 官方文档示例代码中的MemorySaver
以下是langchain v0.3官方示例代码 from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import START, MessagesState, StateGraph# 可以理解为:定义一个流程,这个流程中用到的数据类型是Messages。 <---定义一个有向图&…...
JumpServer基础功能介绍演示
堡垒机可以让运维人员通过统一的平台对设备进行维护,集中的进行权限的管理,同时也会对每个操作进行记录,方便后期的溯源和审查,JumpServer是由飞致云推出的开源堡垒机,通过简单的安装配置即可投入使用,本文…...
Spring @Bean注解使用场景二
bean:最近在写一篇让Successfactors顾问都能搞明白的sso的逻辑的文章,所以一致在研究IAS的saml2.0的协议,希望用代码去解释SP、idp的一些概念,让顾问了解SSO与saml的关系,在github找代码的时候发现一些代码的调用关系很难理解&…...
创业者认知、思辨、成长指南
一、为什么要创业? 1、因为没有家产继承和家庭关系,不能躺平; 比如父母留下了大量的财富,靠钱生钱吃利息,收租,做做投资这些形式,就可以活得很好; 再比如父母或者血亲有资源&#…...
ECharts中Map(地图)样式配置、渐变色生成
前言 ECharts是我们常用的图表控件,功能特别强大,每次使用都要查API比较繁琐,这里就记录开发中常用的配置。 官网:https://echarts.apache.org/handbook/zh/get-started 配置项:https://echarts.apache.org/zh/opti…...
PostgreSQL存储管理体系结构学习笔记2
1.表和元组的组织方式 在PostgreSQL中,同一个表中的元组按照创建顺序依次插入到表文件中。元组之间不进行关联,这样的表文件称之为堆文件。PostgreSQL系统中包含了四种堆文件:普通堆,临时堆,序列,TOAST表。…...
【PTA题目解答】7-3 字符串的全排列(20分)next_permutation
1.题目 给定一个全由小写字母构成的字符串,求它的全排列,按照字典序从小到大输出。 输入格式: 一行,一个字符串,长度不大于8。 输出格式: 输出所有全排列,每行一种排列形式,字典序从小到大。 输入样例…...
SOME/IP:用Python实现协议订阅、Offer、订阅ACK与报文接收
文章目录 前言一、代码层次二、详细代码1. eth_scapy_sd.py2、eth_scapy_someip.py3、network_define.py4、packet_define.py5、unpack_define.py6、someip_controller.py 前言 1、需要pip安装scapy库 2、需要修改根据实际情况配置network_define.py 3、执行someip_controller…...
嵌入式八股ARM篇
前言 ARM篇主要介绍一下寄存器和中断机制,至于汇编这一块…还请大家感兴趣自行学习 1.寄存器 R0 - R3 R4 - R11 寄存器 R0 - R3一般用作函数传参 R4 - R11用来保存程序运算的中间结果或函数的局部变量 在函数调用过程中 注意在发生异常的时候 cortex-M0架构会自动将R0-R3压入…...
剑指 Offer II 087. 复原 IP
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20087.%20%E5%A4%8D%E5%8E%9F%20IP/README.md 剑指 Offer II 087. 复原 IP 题目描述 给定一个只包含数字的字符串 s ,用以表示一个 IP 地址…...
RCE-Labs超详细WP-Level10(无字母命令执行_二进制整数替换)
温馨提示 这关涉及的知识点较多, 写的很长, 中间留了很多错误引导(本人在实验时遇到的问题, 或许你们也会遇到), 在后文才逐步解释源码分析 跟前几关一样, 更改了 WAF 的过滤字段这个关卡, 只有0, 1, (单引号), $, <, \ , ( , )可以用解题分析(实验这些命令, 可以先在自己本…...
数据结构(泛型)
1,装箱 int i 10;Integer j Integer.valueOf(i);2.拆箱 Integer i 10;int j i.intValue(); 3.自动装箱 int i 10;Integer j i;int i 10;Integer j (Integer) i; 4,自动拆箱 Integer i 10;int j i;Integer i 10;int j (int) i; 有一段代码需要解析一下: …...
Android Dagger2 框架辅助工具模块深度剖析(六)
一、引言 在 Android 开发领域,依赖注入(Dependency Injection,简称 DI)作为一种至关重要的设计模式,能显著降低代码间的耦合度,提升代码的可测试性与可维护性。Dagger2 作为一款强大的依赖注入框架&#…...
LVGL第三方库的使用(中文库)
一、第三方库文档 3rd party libraries(第三方库) — LVGL 文档 FreeType 中文字库 SDL 模拟器使用freetype中文字库 1.开启字库 2.安装freetype 字库 sudo apt-get update sudo apt-get install libfreetype6-dev 3.修改makefile 添加字库 4.显示中…...
【愚公系列】《高效使用DeepSeek》009-PPT大纲自动生成
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
使用easyexcel实现单元格样式设置和下拉框设置
1.单元格样式设置 1.1实体类 public class DemoData {ExcelProperty("PK")private String name;ExcelProperty("年龄")private int age;// 必须提供无参构造方法public DemoData() {}public DemoData(String name, int age) {this.name name;this.age …...
ngx_conf_read_token
file_size ngx_file_size(&cf->conf_file->file.info); 此时 file_size2656 当然还是和上次一样 for ( ;; ) {if (b->pos > b->last) { 此时 b->pos 0x57759a8b77f4 b->last 0x57759a8b8230 b->start0x57759a8b77d0 条件不成立 ch *b->po…...
Certbot实现SSL免费证书自动续签(CentOS 7 + nginx/apache)
在 CentOS 上,你可以使用 Let’s Encrypt 提供的 Certbot 工具来申请和自动续约免费的 SSL 证书。 1. 安装 Certbot CentOS 7 安装 EPEL 和 Certbot yum install -y epel-release yum install -y certbot python3-certbot-nginx如果使用的是 Apache: …...
【使用 Java 调用命令行工具:完整指南】
在 Java 中调用命令行工具是一个常见的需求,尤其是在需要与外部程序交互或执行系统命令时。本文将详细介绍如何使用 Java 调用命令行工具,并提供一个完整的示例来演示如何下载视频。 1. 为什么需要调用命令行工具? 命令行工具通常提供了强大…...
pythonSTL---sys
sys 是 Python 标准库中的一个内置模块,它提供了许多与 Python 解释器和系统环境进行交互的功能。 sys方法 1. 导入 sys 模块 在使用 sys 库的功能之前,需要先导入它: import sys2. 命令行参数 (sys.argv) sys.argv 是一个包含命令行参数…...
数据分布偏移检测:保障模型在生产环境中的稳定性
数据分布偏移检测:保障模型在生产环境中的稳定性 引言 在机器学习系统从开发环境部署到生产环境的过程中,数据分布偏移问题是影响模型性能的主要挑战之一。当训练数据与生产环境中的数据分布不一致时,即使是经过精心调优的模型也可能表现出明显的性能下降。本文将深入探讨…...
redis删除与先判断再删除的区别
在Redis中,“先判断存在再删除”与“直接删除”的区别主要体现在操作效率、原子性保障、并发安全性三个方面,具体对比如下: 1. 操作效率 直接删除:仅需执行DEL命令一次,无论键是否存在均直接操作…...
3.6、数字签名
目录 数字签名数字签名与验证过程 数字签名 数字签名是签名者使用自己的私钥对待签名数据的哈希值做密码运算得到的一个结果 第一签名者用自己的私钥来对我们待签数据的哈希值进行签名,直接对数据进行签名其实也是可以的,只是对数据签名,这…...
华为手机助手输入连接码时光标乱跳
问题复现:输入12345678,光标自动跳转导致连接码出现乱序情况。 千万别试着找出规律,已试动态规律非大牛误轻试 问题原因: 想啥呢?华哥的软件又不是我开发我要Know Why干啥 我只需关心解决方案 (可能时输入…...
本地化部署Deepseek关于Ollama 安全加固方案(新手易学)
本地化部署Deepseek关于Ollama 安全加固方案(新手易学) 本方案针对使用ChatBox调用Ollama部署DeepSeek-R1:14b模型时的安全防护需求,提供四重防护措施。 🔒 一、关闭外网访问(关键步骤) 1. 修改监听地址 …...
C++ STL算法函数 —— 应用及其操作实现
一、STL算法函数分类概述 STL算法库提供了大量实用函数,按功能可分为以下五类: 1. 不修改序列的操作 定义:这些算法不会改变容器中的元素,仅对数据进行查询或统计。 典型函数: 函数功能示例find(first, last, value…...