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

02/06 软件设计模式

目录

一.创建型模式

抽象工厂 Abstract Factory

构建器 Builder

工厂方法 Factory Method

原型 Prototype

单例模式  Singleton

二.结构型模式

适配器模式  Adapter

桥接模式  Bridge

组合模式  Composite

装饰者模式  Decorator

外观模式  Facade

享元模式  Flyweight

代理模式  Proxy

三.行为型模式 Behavioral Patterns

责任链模式 Chain of Responsibility 

命令模式 Command 

解释器模式  Interpreter

迭代器模式 Iterator

中介者模式  Mediator

备忘录模式  Memento

观察者模式 Observer 

状态模式  State

策略模式  Strategy

访问者模式  Visitor


  • 定义: 设计模式是针对软件设计中常见问题的可重用解决方案。

  • 作用: 提高代码的可复用性、可维护性和可扩展性。

  • 分类:

    • 创建型模式: 关注对象的创建过程,例如:工厂方法模式、抽象工厂模式、单例模式等。

    • 结构型模式: 关注类和对象的组合方式,例如:适配器模式、装饰器模式、代理模式等。

    • 行为型模式: 关注对象之间的通信和职责分配,例如:观察者模式、策略模式、模板方法模式等。

一.创建型模式

记忆方式:“单身的工人抽烟,想着建筑的原因。”

(5种)单例,工厂,抽象工厂,构建器,原型


抽象工厂 Abstract Factory

旨在提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。它允许客户端代码在不需要了解具体实现的情况下,这个模式通常用于需要创建多个相关对象的场景,尤其是在产品族的情况下。

  • (Abstract Factory):抽象工厂 - 定义创建产品对象的接口。
  • (Concrete Factory):具体工厂 - 实现抽象工厂接口,负责创建具体的产品对象。
  • (Abstract Product):抽象产品 - 定义产品的接口。
  • (Product):具体产品 - 实现抽象产品接口的具体类。

使用场景:

- 当系统需要独立于其产品的创建、组合和表示时。

- 当系统需要使用多个系列的产品,而不需要依赖于具体的产品实现时。

- 当产品的具体类在运行时决定时。


构建器 Builder

旨在简化复杂对象的构建过程。它通过将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

  • Builder(建造者):定义创建一个产品所需的各个部件的抽象接口。
  • ConcreteBuilder(具体建造者):实现Builder接口,构建和装配各个部件,提供一个方法来返回构建好的产品。
  • Director(指挥者):负责管理Builder的构建过程,调用具体建造者的方法来构建产品。
  • Product(产品):最终构建的复杂对象。

使用场景:

- 当一个对象的构建过程复杂,且需要多个步骤时。

- 构造过程必须允许已构建对象有不同表示。


工厂方法 Factory Method

定义一个创建对象的接口,让子类决定实例化哪一个类。

  • 产品接口(Product):定义了工厂方法所创建的对象的接口。
  • 具体产品(ConcreteProduct):实现了Product产品接口的具体类。
  • 工厂接口(Creator):声明了一个工厂方法,返回一个Product产品对象。
  • 具体工厂(ConcreteCreator):实现了工厂接口,返回具体产品的实例。

原型 Prototype

它允许通过复制现有的实例来创建新对象,而不是通过直接实例化类。这种模式特别适合于需要创建大量相似对象的场景,能够提高性能并减少内存消耗。

  • 原型接口(Prototype):定义一个用于复制自身的接口。
  • 具体原型(ConcretePrototype):实现原型接口,提供具体的克隆方法。
  • 客户端(Client):使用原型实例来创建新的对象。

使用场景

- 当一个类的实例化成本较高时,可以考虑使用原型模式。

- 当需要创建大量相似对象时,原型模式可以有效减少内存消耗。

- 当对象的状态需要在运行时动态改变时,原型模式提供了灵活性。


单例模式  Singleton

确保一个类只有一个实例,并提供一个全局访问点。将类的构造函数私有化,并提供一个静态方法获取唯一实例。

它常用于需要控制资源访问的场景,比如数据库连接、线程池等。

使用场景

- 需要控制资源的访问,如数据库连接、线程池等。

- 需要全局访问的配置类。

- 需要在整个应用中共享的状态。


二.结构型模式

该类模式主要用于如何组合已有的类和对象以获得更大的结构,一般借鉴封装,代理,继承等概念讲一个或多个类或对象进行组合,封装,以提供同一的外部视图或新的功能。

记忆:“外桥享组装代”

适配器模式  Adapter

  • 问题: 需要将一个类的接口转换成客户端期望的另一个接口。

  • 解决方案: 创建一个适配器类,将目标接口转换成适配者接口。

  • 记忆技巧: 适配器就像一个转接头,连接不兼容的接口。

  • 1. **目标接口(Target)**:客户端所期待的接口。
  • 2. **适配者(Adaptee)**:需要被适配的类,通常是已有的类。
  • 3. **适配器(Adapter)**:实现目标接口,并持有一个适配者的实例,将目标接口的方法调用转发给适配者。

使用场景

- 当你希望使用一些现有的类,但其接口不符合你的需求时。

- 当你想要创建一个可以与多个不兼容接口的类协同工作的系统时。


桥接模式  Bridge

通过将类的抽象部分与实现部分分离,使得二者可以独立变化。它是一种对象结构型模式,又称为柄体模式(Handle and Body )或接口模式(Interface)这个模式主要用于解决类的层次结构过于复杂的问题

  • 1. **抽象类(Abstraction)**:定义了抽象的接口,并维护一个指向Implementor实现的指针。
  • 2. **扩展抽象类(Refined Abstraction)**:由Abstraction轴向类定义,扩展了抽象类的功能。
  • 3. **实现类接口(Implementor)**:定义了实现部分的接口。这个接口不一定要和Abstraction的接口完全一致,可以完全不同,一把来说,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作
  • 4. **具体实现类(Concrete Implementor)**:实现了实现类接口,提供具体的实现。

适用场景

- 当你需要在多个维度上扩展系统时。

- 当你希望避免在类的层次结构中产生过多的子类时。

- 当你希望在运行时动态切换实现时。


组合模式  Composite

它允许将对象组合成树形结构以表示“部分-整体”的层次关系。组合模式使得客户端对单个对象和组合对象的使用具有一致性。

  • 1. **组件(Component)**:定义了叶子和组合对象的共同接口。,所有的叶子节点和组合节点都需要实现这个接口。
  • 2. **叶子节点(Leaf)**:实现了组件Component接口,表示树的叶子节点。它有自己的行为。
  • 3. **组合节点(Composite)**:实现了组件接口,能够包含叶子和其他组合对象。它可以包含子节点(其他的叶子或组合节点),并实现了添加和删除子节点的方法。

适用场景

- 当需要表示对象的部分-整体层次结构时。

- 当希望客户端忽略组合对象和单个对象的差异时。


装饰者模式  Decorator

问题: 需要动态地给一个对象添加一些额外的职责。

解决方案: 创建一个装饰器类,包装原始对象,并在保持原始对象接口的前提下提供额外的功能。装饰器就像给蛋糕加奶油,可以不断添加新的装饰。

  • 组件接口(Component):定义一个对象接口,可以给这些对象动态地添加职责。
  • 具体组件(ConcreteComponent):实现了组件接口的具体对象,定义了被装饰的对象。
  • 装饰器(Decorator):持有一个组件对象的引用,并定义与组件接口一致的接口。
  • 具体装饰器(ConcreteDecorator):扩展了装饰器类,添加了额外的职责。

外观模式  Facade

它为复杂的子系统提供一个统一的接口,使得子系统更易于使用。通过外观模式,客户端可以通过一个简单的接口与复杂的系统进行交互,而不需要了解系统内部的复杂性。

外观类(Facade):提供一个简单的接口,封装了复杂的子系统。

子系统类(Subsystem):实现具体的功能,通常包含多个类,外观类通过这些类来完成具体的操作。

使用场景

- 当需要为复杂的子系统提供一个简单的接口时。

- 当需要解耦客户端与子系统之间的关系时。

- 当希望提高系统的可读性和可维护性时。


享元模式  Flyweight

旨在通过共享对象来减少内存使用和提高性能。它特别适用于大量相似对象的场景。享元模式的核心思想是将对象的状态分为两部分:内部状态和外部状态。

内部状态**:对象可以共享的状态,通常是不可变的。多个对象可以共享同一个内部状态。

外部状态**:对象特有的状态,通常是可变的。外部状态在使用对象时传递给对象。

  • Flyweight:享元接口,定义了需要实现的方法。
  • ConcreteFlyweight:具体享元类,实现了Flyweight接口,包含内部状态。
  • FlyweightFactory:享元工厂,负责创建和管理享元对象,确保共享相同的对象。

使用场景:

当应用程序需要大量相似对象时。

当对象的创建和管理成本较高时。

当需要减少内存使用时。


代理模式  Proxy

  • 问题: 需要控制对某个对象的访问,或者需要在访问对象时执行一些额外的操作。

  • 解决方案: 创建一个代理类,代表原始对象,并在访问原始对象之前或之后执行一些操作。代理就像一个中介,控制对真实对象的访问

  • 主题接口(Subject):定义了代理和真实对象的共同接口。
  • 真实主题(RealSubject)**:实现了主题接口,定义了代理所代表的真实对象。
  • 代理 Proxy:持有对真实主题的引用,并实现了主题接口,控制对真实主题的访问。

代理模式通常用于以下几种情况:

1. **远程代理**:为一个对象在不同地址空间提供局部代表。

2. **虚拟代理**:根据需要创建开销较大的对象,延迟对象的创建。

3. **保护代理**:控制对原始对象的访问,提供不同的访问权限。

使用场景

-对象创建开销很大

- **网络请求**:在网络请求中,代理可以用于缓存响应,减少网络延迟。

- **权限控制**:在访问敏感数据时,代理可以检查用户权限。

- **资源管理**:在处理大对象时,代理可以延迟加载,优化性能。


三.行为型模式 Behavioral Patterns

该类模式主要用于对象之间的职责及其提供的服务的分配,它不仅描述对象或类的模式,还描述了他们之间的通信模式,特别是描述一组对等的对象怎样相互协作以完成其中任一对象都无法单独完成的任务。

记忆:10种

责命解,迭中备,观状策,访搞定。

  • 责命解:责任链、命令、解释器。

  • 迭中备:迭代器、中介者、备忘录。

  • 观状策:观察者、状态、策略。

  • 访搞定:访问者搞定一切!

责任链模式 Chain of Responsibility 

它允许将请求的发送者和接收者解耦,使多个对象都有机会处理请求。创建一个对象链,每个对象依次尝试处理请求,直到某个对象处理成功为止。

  • 1. **Handler(处理者)**: 定义一个处理请求的接口,并实现链中的处理逻辑。
  • 2. **ConcreteHandler(具体处理者)**: 实现Handler接口,处理请求或将请求传递给下一个处理者。
  • 3. **Client(客户端)**: 创建具体处理者并设置链的顺序,发送请求。

工作原理

1. 客户端创建多个处理者,并将它们连接成一条链。

2. 客户端发送请求,链中的处理者依次检查是否能够处理该请求。

3. 如果某个处理者能够处理请求,则执行相应的处理逻辑;如果不能,则将请求传递给链中的下一个处理者。

应用场景:审批流程、异常处理、事件处理等。


命令模式 Command 

  • 目的:将请求封装为对象,使得可以用不同的请求对客户进行参数化。

  • 核心思想:将“操作”抽象为对象,支持撤销、重做、日志记录等功能。

  • 1. **命令接口(Command)**:定义一个执行操作的接口。
  • 2. **具体命令(ConcreteCommand)**:实现命令接口,定义与接收者之间的绑定关系,并调用接收者的相应操作。
  • 3. **接收者(Receiver)**:知道如何实施与执行一个请求相关的操作。
  • 4. **调用者(Invoker)**:负责调用命令对象来执行请求。
  • 5. **客户端(Client)**:创建具体命令对象并设置接收者。
  • 应用场景:GUI 按钮操作、任务队列、事务管理等。

解释器模式  Interpreter

  • 目的:定义语言的文法规则,并解释执行语言中的句子。

  • 核心思想:将语言中的每个符号映射为一个类,通过组合这些类来解析和执行语言。

  • 应用场景:正则表达式解析、数学公式计算、编译器设计等。

  • 1. 抽象表达式(AbstractExpression):定义一个解释操作的接口,所有具体表达式都需要实现这个接口。
  • 2. 终结符表达式(TerminalExpression):实现了抽象表达式接口,表示文法中的基本元素。通常是一些简单的语法规则。
  • 3. 非终结符表达式(NonTerminalExpression):同样实现了抽象表达式接口,表示文法中的复杂结构,由多个终结符和非终结符组合而成。
  • 4. 上下文(Context):包含了在解释过程中需要的一些信息,通常是输入的字符串或其他数据。

工作原理

解释器模式的核心思想是将一个复杂的表达式分解为多个简单的表达式,然后通过递归的方式来解释这些表达式。

假设我们需要解析一个简单的数学表达式,比如加法和减法。我们可以定义以下结构:

- **抽象表达式**:`Expression` 接口,定义 `interpret(Context context)` 方法。

- **终结符表达式**:`NumberExpression` 类,表示数字。

- **非终结符表达式**:`AddExpression` 和 `SubtractExpression` 类,分别表示加法和减法。

具体步骤如下:

1. **定义文法**:首先需要定义要解析的语言的文法规则。

2. **构建表达式树**:根据文法规则构建一个表达式树,树的每个节点都是一个表达式。

3. **解释表达式**:通过遍历表达式树,调用每个节点的解释方法,最终得到结果。

使用场景(适用于特定的解析和执行需求)

- 需要系统要能应对“”自定义“”内容的解析。

- 需要解析和执行简单的语言或表达式。

- 需要对复杂的文法进行处理。

- 需要在运行时动态地解释和执行代码。


迭代器模式 Iterator

  • 目的:提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示。

  • 核心思想:将遍历逻辑从聚合对象中分离出来,封装到一个独立的迭代器对象中。

  • 应用场景:集合类的遍历(如列表、树、图等)。

  • 1. **迭代器(Iterator)**:定义了访问和遍历元素的接口。
  • 2. **具体迭代器(Concrete Iterator)**:实现了迭代器接口,负责遍历具体集合的元素。
  • 3. **聚合(Aggregate)**:定义了创建迭代器的接口。
  • 4. **具体聚合(Concrete Aggregate)**:实现了聚合接口,返回一个具体的迭代器。

中介者模式  Mediator

  • 目的:用一个中介对象来封装一系列对象之间的交互,降低对象之间的耦合度。

  • 核心思想:将对象之间的直接通信改为通过中介者间接通信。

  • 应用场景:聊天室、事件调度系统、GUI 组件交互等。

  • 1. **中介者接口(Mediator)**:定义了与各个同事对象交互的方法。
  • 2. **具体中介者(ConcreteMediator)**:实现中介者接口,维护对各个同事对象的引用,并协调它们之间的交互。
  • 3. **同事类(Colleague)**:各个参与者,它们通过中介者进行交互,而不是直接相互交互。

备忘录模式  Memento

  • 目的:在不破坏封装性的前提下,捕获并外部化一个对象的内部状态,以便以后恢复。

  • 核心思想:将对象的状态保存到备忘录对象中,并在需要时恢复。

  • 应用场景:撤销操作、游戏存档、事务回滚等。

这使得它在需要状态管理的应用程序中非常有用。

  • 1. **Originator(发起人)**:需要保存其内部状态的对象。它可以创建一个备忘录来记录当前状态,并可以使用备忘录恢复状态。
  • 2. **Memento(备忘录)**:用于存储发起人的内部状态。备忘录通常是一个不可变的对象,外部对象无法直接访问其内部状态。
  • 3. **Caretaker(看护者)**:负责管理备忘录的对象。看护者可以保存和恢复备忘录,但不能修改备忘录的内容。

使用场景

- 文本编辑器的撤销/重做功能。

- 游戏中的状态保存与加载。

- 任何需要保存和恢复对象状态的场景。


观察者模式 Observer 

  • 问题: 当一个对象的状态发生改变时,需要通知其他对象,并且这些对象之间是松耦合的。

  • 解决方案: 定义一种一对多的依赖关系,当一个对象改变状态时,所有依赖它的对象都会收到通知并自动更新。

  • 记忆技巧: 观察者模式就像订阅报纸,当有新报纸时,订阅者会自动收到。

  • 1. **主题(Subject)**:被观察的对象,维护观察者的列表,并提供注册、注销观察者的方法。
  • 2. **观察者(Observer)**:依赖于主题的对象,当主题状态变化时,观察者会收到通知并进行相应的更新。
  • 3. **具体主题(Concrete Subject)**:实现了主题接口的具体类,包含状态变化的逻辑。
  • 4. **具体观察者(Concrete Observer)**:实现了观察者接口的具体类,定义了在接收到通知时的行为。

状态模式  State

  • 目的:允许对象在其内部状态改变时改变其行为,使得对象看起来像是修改了它的类。

  • 核心思想:将状态抽象为独立的类,对象的行为随状态的变化而变化。

  • 应用场景:工作流系统、游戏角色状态、订单状态管理等。

  • 1. **Context(上下文)**:持有一个状态对象的引用,并且可以在运行时改变它的状态。
  • 2. **State(状态接口)**:定义一个接口,用于封装与特定状态相关的行为。
  • 3. **ConcreteState(具体状态)**:实现状态接口的具体状态类,每个具体状态类都实现了与该状态相关的行为。

工作原理

- 上下文对象持有一个状态对象的引用。

- 当上下文的状态改变时,它会将状态对象替换为另一个状态对象。

- 每个状态对象实现了状态接口中的方法,定义了在该状态下的具体行为。


策略模式  Strategy

定义了一系列算法,将每个算法封装起来,并使它们可以互换。策略模式让算法独立于使用它的客户端而变化。

  • 1. **策略接口(Strategy)**:定义一个公共接口,所有具体策略都需要实现这个接口。
  • 2. **具体策略(ConcreteStrategy)**:实现策略接口的具体算法。
  • 3. **上下文(Context)**:持有一个策略的引用,并可以在运行时选择具体的策略。

使用场景

- 当你有多个算法可以选择,并且希望在运行时选择其中一个。

- 当你希望将算法的实现与使用算法的代码分离。

- 当你需要避免使用大量的条件语句(如 `if-else` 或 `switch`)。


访问者模式  Visitor

允许你在不改变对象结构的前提下,定义新的操作。这个模式的核心思想是将算法与对象结构分离,使得你可以在不修改对象的情况下,添加新的操作。适用于需要对一组对象执行多种操作的场景。

  • 1. **Visitor(访问者)**: 定义了对每个元素的访问操作。
  • 2. **Element(元素)**: 接受访问者的访问,通常是一个接口或抽象类。
  • 3. **ConcreteElement(具体元素)**: 实现了 Element 接口的具体类。
  • 4. **ObjectStructure(对象结构)**: 维护一组元素,并提供一个方法来允许访问者访问这些元素。

工作原理

- 访问者模式通过在元素类中定义一个 `accept` 方法,接受一个访问者对象。

- 访问者对象实现了对每个具体元素的操作。

- 当访问者访问元素时,元素会调用访问者的相应方法,从而实现对元素的操作。


相关文章:

02/06 软件设计模式

目录 一.创建型模式 抽象工厂 Abstract Factory 构建器 Builder 工厂方法 Factory Method 原型 Prototype 单例模式 Singleton 二.结构型模式 适配器模式 Adapter 桥接模式 Bridge 组合模式 Composite 装饰者模式 Decorator 外观模式 Facade 享元模式 Flyw…...

Java的Integer缓存池

Java的Integer缓冲池? Integer 缓存池主要为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围,因此缓存这些对象可以减少内存分配和垃圾回收的负担,提升性能。 在-128到 127范围内的 Integer 对象会被缓存和复用…...

[特殊字符] ChatGPT-4与4o大比拼

🔍 ChatGPT-4与ChatGPT-4o之间有何不同?让我们一探究竟! 🚀 性能与速度方面,GPT-4-turbo以其优化设计,提供了更快的响应速度和处理性能,非常适合需要即时反馈的应用场景。相比之下,G…...

2024年12月 Scratch 图形化(二级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化(二级)真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题,共50分) 第 1 题 小猫初始位置和方向如下图所示,下面哪个选项能让小猫吃到老鼠?( ) A. B. …...

【2025】camunda API接口介绍以及REST接口使用(3)

前言 在前面的两篇文章我们介绍了Camunda的web端和camunda-modeler的使用。这篇文章主要介绍camunda结合springboot进行使用,以及相关api介绍。 该专栏主要为介绍camunda的学习和使用 🍅【2024】Camunda常用功能基本详细介绍和使用-下(1&…...

35.Word:公积金管理中心文员小谢【37】

目录 Word1.docx ​ Word2.docx Word2.docx ​ 注意本套题还是与上一套存在不同之处 Word1.docx 布局样式的应用设计页眉页脚位置在水平/垂直方向上均相对于外边距居中排列:格式→大小对话框→位置→水平/垂直 按下表所列要求将原文中的手动纯文本编号分别替换…...

关于使用numpy进行数据解析性能优化的几点认识

前言:数据解析的性能严重影响用户体验,针对需要批量处理的数据,考虑使用numpy自定义矢量化计算函数提升数据解析的性能。下面的表述都是网上查找的资料,仅供大家参考,具体情况还是需要具体分析的。 1. 使用numpy自定义…...

扣子平台的选择器节点:让智能体开发更简单,扣子免费系列教程(17)

欢迎来到涛涛聊AI。今天,我们来聊聊一个非常实用的工具——扣子平台的选择器节点。即使你不是计算机专业人员,但对计算机操作比较熟悉,这篇文章也能帮你快速上手。我们会从基础知识讲起,一步步带你了解选择器节点的使用方法和应用…...

java s7接收Byte字节,接收word转16位二进制

1图: 2.图: try {List list getNameList();//接收base64S7Connector s7Connector S7ConnectorFactory.buildTCPConnector().withHost("192.168.46.52").withPort(102).withTimeout(1000) //连接超时时间.withRack(0).withSlot(3).build()…...

学习日记250205

一.论文 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 二、计划: 理一下微调相关的文章 三. )——( 明天认真学习了,不能再打这么久的星露谷了!!&#xff0…...

位置-速度双闭环PID控制详解与C语言实现

目录 概述 1 控制架构解析 1.1 级联控制结构 1.2 性能对比 2 数学模型 2.1 位置环(外环) 2.2 速度环(内环) 3 C语言完整实现 3.1 控制结构体定义 3.2 初始化函数 3.3 双环计算函数 4 参数整定指南 4.1 整定步骤 4.2 典型参数范围 5 关键优化技术 5.1 速度前馈 …...

21.2.1 基本操作

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 Excel的基本操作步骤: 1、打开Excel:定义了一个Application对象: Microsoft.Office.Interop.E…...

Python-基于PyQt5,Pillow,pathilb,imageio,moviepy,sys的GIF(动图)制作工具

前言:在抖音,快手等社交平台上,我们常常见到各种各样的GIF动画。在各大评论区里面,GIF图片以其短小精悍、生动有趣的特点,被广泛用于分享各种有趣的场景、搞笑的瞬间、精彩的动作等,能够快速吸引我们的注意…...

c++ stl 遍历算法和查找算法

概述&#xff1a; 算法主要由头文件<algorithm> <functional> <numeric> 提供 <algorithm> 是所有 STL 头文件中最大的一个&#xff0c;提供了超过 90 个支持各种各样算法的函数&#xff0c;包括排序、合并、搜索、去重、分解、遍历、数值交换、拷贝和…...

Java学习进阶路线

Java基础 Java Web 前端HTML/css/js&#xff0c;J2EE&#xff08;Servlet/jsp&#xff09;&#xff0c;数据库&#xff08;Mysql/oracle&#xff09; Java开发框架 Spring MVC/Mybatis/Herbernate/maven 《Java编程思想》 深入了解java基础 Java设计模式 《Effective j…...

探寻系统响应的奥秘:为何常用以 e 为底的指数组合表示

一、引言 在工程与科学领域的系统分析中&#xff0c;常常会发现系统响应多以 e e e 为底的指数组合来表示。从电路系统里的电流电压变化&#xff0c;到机械系统的振动情况&#xff0c;再到控制系统的动态特性&#xff0c;这种表示方法无处不在。那么&#xff0c;究竟是什么原…...

java 进阶教程_Java进阶教程 第2版

第2版前言 第1版前言 语言基础篇 第1章 Java语言概述 1.1 Java语言简介 1.1.1 Java语言的发展历程 1.1.2 Java的版本历史 1.1.3 Java语言与C&#xff0f;C 1.1.4 Java的特点 1.2 JDK和Java开发环境及工作原理 1.2.1 JDK 1.2.2 Java开发环境 1.2.3 Java工作原理 1.…...

Ext文件系统

文件内容属性 被打开的文件在内存中&#xff0c;没有被打开的文件在磁盘里文件系统的工作就是根据路径帮我们找到在磁盘上的文件 磁盘&#xff08;硬件&#xff09; 磁盘的存储结构 磁头在传动臂的运动下共同进退&#xff0c;向磁盘写入的时候是向柱面批量写入的 OS文件系统访…...

C++滑动窗口技术深度解析:核心原理、高效实现与高阶应用实践

目录 一、滑动窗口的核心原理 二、滑动窗口的两种类型 1. 固定大小的窗口 2. 可变大小的窗口 三、实现细节与关键点 1. 窗口的初始化 2. 窗口的移动策略 3. 结果的更新时机 四、经典问题与代码示例 示例 1&#xff1a;和 ≥ target 的最短子数组&#xff08;可变窗口…...

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)

目录 1 -> List 1.1 -> 创建List组件 1.2 -> 添加滚动条 1.3 -> 添加侧边索引栏 1.4 -> 实现列表折叠和展开 1.5 -> 场景示例 2 -> dialog 2.1 -> 创建Dialog组件 2.2 -> 设置弹窗响应 2.3 -> 场景示例 3 -> form 3.1 -> 创建…...

【加餐】使⽤指针实现链表

【加餐】使⽤指针实现链表 ​ 面向过程方式和面向对象方式&#xff08;把面向过程的封装一下就行了&#xff09;是两种不同的编程方法论...

用 Python 绘制爱心形状的简单教程

1. 引言 在本教程中&#xff0c;我们将学习如何使用 Python 和 Matplotlib 库来绘制一个简单的爱心形状。这是一个有趣且简单的项目&#xff0c;适合初学者练习图形绘制和数据可视化。 2. 环境准备 首先&#xff0c;确保您的系统上安装了 Python 和 Matplotlib 库。如果还未…...

DeepSeek安装

安装运行环境 https://ollama.com/ 安装验证 cmd指令 ollama -v 安装运行模型 https://ollama.com/library/deepseek-r1:14b-qwen-distill-q4_K_M 例如&#xff1a; ollama run deepseek-r1:1.5b-qwen-distill-q4_K_M 结果 再次使用时&#xff0c;直接cmd运行上一步的ru…...

Git--使用教程

Git的框架讲解 Git 是一个分布式版本控制系统&#xff0c;其架构设计旨在高效地管理代码版本&#xff0c;支持分布式协作&#xff0c;并确保数据的完整性和安全性。 Git 的核心组件&#xff1a; 工作区&#xff08;Working Directory&#xff09;&#xff1a; - 作区是你在本…...

【HTML性能优化】提升网站加载速度:GZIP、懒加载与资源合并

系列文章目录 01-从零开始学 HTML&#xff1a;构建网页的基本框架与技巧 02-HTML常见文本标签解析&#xff1a;从基础到进阶的全面指南 03-HTML从入门到精通&#xff1a;链接与图像标签全解析 04-HTML 列表标签全解析&#xff1a;无序与有序列表的深度应用 05-HTML表格标签全面…...

C#从XmlDocument提取完整字符串

方法1&#xff1a;通过XmlDocument的OuterXml属性&#xff0c;见XmlDocument类 该方法获得的xml字符串是不带格式的&#xff0c;可读性差 方法2&#xff1a;利用XmlWriterSettings控制格式等一系列参数&#xff0c;见XmlWriterSettings类 例子&#xff1a; using System.IO; …...

wordpress每隔24小时 随机推荐一个指定分类下的置顶内容。

在WordPress中实现每隔24小时随机推荐一个指定分类下的置顶内容&#xff0c;可以通过以下步骤实现&#xff1a; 1. 创建自定义函数 在主题的functions.php文件中添加以下代码&#xff0c;用于创建一个定时任务&#xff0c;每隔24小时随机选择一个置顶文章并存储到选项中&…...

《chatwise:DeepSeek的界面部署》

ChatWise&#xff1a;DeepSeek的界面部署 摘要 本文详细描述了DeepSeek公司针对其核心业务系统进行的界面部署工作。从需求分析到技术实现&#xff0c;再到测试与优化&#xff0c;全面阐述了整个部署过程中的关键步骤和解决方案。通过本文&#xff0c;读者可以深入了解DeepSee…...

HTTP请求响应周期步骤

一个典型的 HTTP 请求/响应周期 从建立连接开始,经过客户端向服务器发送请求、服务器处理请求并返回响应,最终关闭连接。这个过程可以分为多个阶段,以下是详细的步骤: 一、建立连接(TCP连接) 客户端发起连接请求:在HTTP通信中,客户端通常是浏览器,首先通过 DNS 查询…...

synchronized, volatile 在 DCL 的作用

背景 最近在看设计模式&#xff0c;在单例模式的 Double Check Lock&#xff08;DCL&#xff09;中&#xff0c;存在两个关键字&#xff1a;volatile & synchronized。 之前都知道 DCL 怎么写&#xff0c;直接套娃。但是这两关键字在单例里面的作用还没深究过&#xff0c…...

Java进阶笔记(中级)

-----接Java进阶笔记&#xff08;初级&#xff09;----- 目录 集合多线程 集合 ArrayList 可以通过List来接收ArrayList对象&#xff08;因为ArrayList实现了List接口&#xff09; 方法&#xff1a;接口名 柄名 new 实现了接口的类(); PS: List list new ArrayList();遍历…...

人生总有终点,不必好高骛远

夕阳西下&#xff0c;我漫步在河堤上。河水缓缓流淌&#xff0c;倒映着天边最后一抹晚霞。岸边垂柳依依&#xff0c;枝条轻拂水面&#xff0c;荡起一圈圈涟漪。这涟漪由近及远&#xff0c;渐渐消散在暮色中&#xff0c;如同我们每个人在时间长河中泛起的微澜。 记得年少时&…...

C#中堆和栈的区别

C#中的堆&#xff08;Heap&#xff09;和栈&#xff08;Stack&#xff09;详解 基本概念 栈&#xff08;Stack&#xff09; 栈是一个后进先出&#xff08;LIFO&#xff09;的内存结构由系统自动分配和释放存储空间连续&#xff0c;大小固定主要用于存储值类型和对象引用 堆…...

如何利用i18n实现国际化

1.首先新建i18.js文件 // i18n配置 import { createI18n } from vue-i18n // import ElementPlus from element-plus import zhCn from element-plus/es/locale/lang/zh-cn import zh from ./zh-cn import en from ./en import ru from ./ru const messages {en_US: {...en,//…...

SpringMVC响应

第一章&#xff1a;数据处理及跳转 1. 结果跳转方式 ①.ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . <bean id"templateResolver" class"org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolv…...

深入理解特征值与稳定性密码:以弹簧 - 质量 - 阻尼典型二阶系统为例

从看特征值决定稳定性的原因 摘要 本文以弹簧 - 质量 - 阻尼系统这一典型二阶系统为研究对象&#xff0c;深入剖析特征值决定系统稳定性的内在原因。通过详细的数学推导和直观的物理意义阐释&#xff0c;全面揭示了特征值与系统稳定性之间的紧密关联&#xff0c;为理解和分析…...

python pandas 读取合并单元格并保留合并信息

读取合并单元格并保留合并信息 当我们只是使用 pandas 的 read_excel 方法读取 Excel 文件时&#xff0c;我们可能会遇到一个很棘手的问题&#xff1a;合并单元格的信息将会丢失&#xff0c;从而导致我们的数据出现重复或缺失的情况。 在本篇文章中将介绍使用 pandas 正确地读…...

Go-Gin Web 框架完整教程

1. 环境准备 1.1 Go 环境安装 Go 语言&#xff08;或称 Golang&#xff09;是一个开源的编程语言&#xff0c;由 Google 开发。在开始使用 Gin 框架之前&#xff0c;我们需要先安装 Go 环境。 安装步骤&#xff1a; 访问 Go 官网下载页面&#xff1a;https://golang.org/dl…...

机器学习专业毕设选题推荐合集 人工智能

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…...

Java程序员 面试如何介绍项目经验?

项目经历是面试过程中重点问的&#xff0c;但是很多人在回答的时候往往会有问题&#xff1a; 重点是介绍项目&#xff0c;而忽略了个人的经历。 经历是你做了什么、你怎么做的、做完后的结果。例如&#xff1a;项目中的哪些部分是你做的&#xff1f;你是不是核心人员&#xf…...

YONBIP后端环境搭建-IDEA

1、IDEA环境搭建 1.1、插件安装 打开设置窗口&#xff0c;添加自定义插件存储库路径。 https://nccdev.yonyou.com/ide/idea/latest/updatePlugin.xml 在 Marketplace 中搜索 YonBuilder Premium开发者工具 &#xff0c;点击安装。 1.2、Home配置 点击Home配置按钮&#xf…...

Java 微服务实用指南(一)

Java 微服务&#xff1a;基础 要真正理解 Java 微服务&#xff0c;就必须从最基本的东西开始&#xff1a;为人诟病的 Java 大型单体应用是什么&#xff0c;它的优点和缺点是什么。 什么是 Java 大型单体应用&#xff1f; 假设你正在为一家银行或一家金融科技初创公司工作。你为…...

Windows图形界面(GUI)-QT-C/C++ - QT Frame

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 二、使用场景 1. 分隔内容区域 2. 装饰性边框 3. 自定义控件容器 三、常见样式 1. 框架形状&#xff08;Shape&#xff09; 2. 框架阴影&#xff08;Shadow&#xff09;…...

优选算法合集————双指针(专题二)

好久都没给大家带来算法专题啦&#xff0c;今天给大家带来滑动窗口专题的训练 题目一&#xff1a;长度最小的子数组 题目描述&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …...

WebSocket协议里客户端发送给服务器的数据会用4字节的掩码循环异或的分析

首先&#xff0c;我需要回顾WebSocket协议中对掩码处理的具体要求。根据RFC 6455&#xff0c;客户端发送到服务器的帧必须使用掩码&#xff0c;而服务器发送的帧不需要掩码。掩码是4字节的&#xff0c;应用于有效载荷数据&#xff0c;每个字节依次与掩码的对应字节异或&#xf…...

【字节青训营-9】:初探字节微服务框架 Hertz 基础使用及进阶(下)

本文目录 一、Hertz中间件Recovery二、Hertz中间件跨资源共享三、Hertz 响应四、Hertz请求五、Hertz中间件Session 一、Hertz中间件Recovery Recovery中间件是Hertz框架预置的中间件&#xff0c;使用server.Default()可以默认注册该中间件&#xff0c;为Hertz框架提供panic回复…...

新版AndroidStudio 修改 jdk版本

一、问题 之前&#xff0c;在安卓项目中配置JDK和Gradle的过程非常直观&#xff0c;只需要进入Android Studio的File菜单中的Project Structure即可进行设置&#xff0c;十分方便。 如下图可以在这修改JDK: 但是升级AndroidStudio之后&#xff0c;比如我升级到了Android Stu…...

cocos spine执行动画报错Cannot read properties of null (reading ‘data‘)

cocos v3.8.3 当想this.spine.setAnimation(0, "action1", false);播放spine动画时报错↓ 解决方法一&#xff1a; 在setAnimation之前调用this.spine.__preload() 解决方法二&#xff1a; 不要让spine或其父节点通过active显隐...

笔记:新能源汽车零部件功率级测试怎么进行?

摘要:本文旨在梳理主机厂对新能源汽车核心零部件功率级测试需求,通过试验室的主流设备仪器集成,快速实现试验方案搭建,并体现测试测量方案的时效性、便捷性优势。目标是通过提升实现设备的有效集成能力、实现多设备测试过程的有效协同、流程化测试,可快速采集、分析当前数…...

【starrocks学习】之将starrocks表同步到hive

目录 方法 1&#xff1a;通过HDFS导出数据 1. 将StarRocks表数据导出到HDFS 2. 在Hive中创建外部表 3. 验证数据 方法 2&#xff1a;使用Apache Spark同步 1. 添加StarRocks和Hive的依赖 2. 使用Spark读取StarRocks数据并写入Hive 3. 验证数据 方法 3&#xff1a;通过…...