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

软件设计模式

目录

一.创建型模式

抽象工厂 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` 方法,接受一个访问者对象。

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

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


相关文章:

软件设计模式

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

【Leetcode 每日一题 - 补卡】922. 按奇偶排序数组 II

问题背景 给定一个非负整数数组 n u m s nums nums, n u m s nums nums 中一半整数是 奇数 ,一半整数是 偶数 。 对数组进行排序,以便当 n u m s [ i ] nums[i] nums[i] 为奇数时, i i i 也是 奇数 ;当 n u m s [ …...

Redis缓存穿透、击穿、雪崩介绍以及解决方案

一、缓存穿透 1.1 什么是缓存穿透? 指的是,外部进来的请求,查询一个不存在的数据。Redis中没有,数据库中也没有,这时候如果外部恶意大量请求,所有请求会直接查询数据库,导致数据库崩溃 1.2 解决…...

Django框架丨从零开始的Django入门学习

Django 是一个用于构建 Web 应用程序的高级 Python Web 框架,Django是一个高度模块化的框架,使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能…...

AI绘画:解锁商业设计新宇宙(6/10)

1.AI 绘画:商业领域的潜力新星 近年来,AI 绘画技术以惊人的速度发展,从最初简单的图像生成,逐渐演变为能够创造出高度逼真、富有创意的艺术作品。随着深度学习算法的不断优化,AI 绘画工具如 Midjourney、Stable Diffu…...

.net的一些知识点

1.public,protected,private的区别 从访问权限来说是 public>protecd>private 翻译成汉字:公有的>受保护的>私有的 但是在拿那种旧版本(2017及之前)的vs创建class的时候,这个类是没有修饰符的。现在vs2022版本创建带了默认修饰符&#x…...

【Docker】——安装Docker以及解决常见报错

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…...

Linux环境部署DeepSeek大模型

一、背景 【DeepSeek 深度求索】这个春节给了世界一个重磅炸弹,弄得美国都睡不好觉。这次与以往不同,之前我们都是跟随着美国的AI人工智能,现在DeepSeek通过算法上的优化,大大降低了训练模型所需的成本以及时间,短期造…...

Java 面试真题

本题适合一到三年 Java 开发 ,以下问题都是按照原面试官提问记录 文章目录 我要进大厂系列面试题二面 我要进大厂系列面试题 全部真题,欢迎投稿你的面试经验。 本篇涉及基础较多,但要耐性看完。 JVM内存模型垃圾回收器用的哪个gc各个算法…...

Electron使用WebAssembly实现CRC-8 MAXIM校验

Electron使用WebAssembly实现CRC-8 MAXIM校验 将C/C语言代码,经由WebAssembly编译为库函数,可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-8 MAXIM格式校验的方式。 CRC-8 MAXIM校验函数WebAssembly源文件 C语言实现C…...

(一)DeepSeek大模型安装部署-Ollama安装

大模型deepseek安装部署 (一)、安装ollama curl -fsSL https://ollama.com/install.sh | sh sudo systemctl start ollama sudo systemctl enable ollama sudo systemctl status ollama(二)、安装ollama遇到网络问题,请手动下载 ollama-linux-amd64.tgz curl -L …...

Unity游戏(Assault空对地打击)开发(6) 鼠标光标的隐藏

前言 鼠标光标在游戏界面太碍眼了&#xff0c;要隐藏掉。 详细操作 新建一个脚本HideCursor&#xff0c;用于隐藏/取消隐藏光标。 写入以下代码。 意义&#xff1a;游戏开始自动隐藏光标&#xff0c;按Esc&#xff08;隐藏<-->显示&#xff09;。 using System.Collectio…...

蓝桥杯python基础算法(2-1)——排序

目录 一、排序 二、例题 P3225——宝藏排序Ⅰ 三、各种排序比较 四、例题 P3226——宝藏排序Ⅱ 一、排序 &#xff08;一&#xff09;冒泡排序 基本思想&#xff1a;比较相邻的元素&#xff0c;如果顺序错误就把它们交换过来。 &#xff08;二&#xff09;选择排序 基本思想…...

算法随笔_36: 复写零

上一篇:算法随笔_35: 每日温度-CSDN博客 题目描述如下: 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改…...

基于springboot的体质测试数据分析及可视化设计

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…...

知识蒸馏教程 Knowledge Distillation Tutorial

来自于&#xff1a;Knowledge Distillation Tutorial 将大模型蒸馏为小模型&#xff0c;可以节省计算资源&#xff0c;加快推理过程&#xff0c;更高效的运行。 使用CIFAR-10数据集 import torch import torch.nn as nn import torch.optim as optim import torchvision.tran…...

排序算法--选择排序

选择排序虽然简单&#xff0c;但时间复杂度较高&#xff0c;适合小规模数据或教学演示。 // 选择排序函数 void selectionSort(int arr[], int n) {for (int i 0; i < n - 1; i) { // 外层循环控制当前最小值的存放位置int minIndex i; // 假设当前位置是最小值的索引// 内…...

视频融合平台EasyCVR无人机场景视频压缩及录像方案

安防监控视频汇聚EasyCVR平台在无人机场景中发挥着重要的作用&#xff0c;通过高效整合视频流接入、处理与分发等功能&#xff0c;为无人机视频数据的实时监控、存储与分析提供了全面支持&#xff0c;广泛应用于安防监控、应急救援、电力巡检、交通管理等领域。 EasyCVR支持GB…...

【react-redux】react-redux中的 useDispatch和useSelector的使用与原理解析

一、useSelector 首先&#xff0c;useSelector的作用是获取redux store中的数据。 下面就是源码&#xff0c;感觉它的定义就是首先是createSelectorHook这个方法先获得到redux的上下文对象。 然后从上下文对象中获取store数据。然后从store中得到选择的数据。 2、useDispatc…...

【自学笔记】Git的重点知识点-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Git基础知识Git高级操作与概念Git常用命令 总结 Git基础知识 Git简介 Git是一种分布式版本控制系统&#xff0c;用于记录文件内容的改动&#xff0c;便于开发者追踪…...

【大模型实战】0代码基于DeepSeek-R1搭建本地知识库,打造专属智能助手

【大模型实战】0代码基于DeepSeek-R1搭建本地知识库,打造专属智能助手 一、ollama下载与安装二、部署deepseek私有模型三、部署embedding模型四、可视化操作工具(1)下载与安装工具(2)部署安装的模型(3) 添加知识库(4)添加智能体助手(5) 助手问答一、ollama下载与安装…...

[LeetCode] 二叉树 I — 深度优先遍历(前中后序遍历) | 广度优先遍历(层序遍历):递归法迭代法

二叉树 基础知识深度优先遍历递归法迭代法&#xff08;栈&#xff09;144# 二叉树的前序遍历94# 二叉树的中序遍历145# 二叉树的后序遍历 广度优先遍历递归法迭代法&#xff08;队列&#xff09;102# 二叉树的层序遍历107# 二叉树的层序遍历 II199# 二叉树的右视图637# 二叉树的…...

【OS】AUTOSAR架构下的Interrupt详解(上篇)

目录 前言 正文 1.中断概念分析 1.1 中断处理API 1.2 中断级别 1.3 中断向量表 1.4 二类中断的嵌套 1.4.1概述 1.4.2激活 1.5一类中断 1.5.1一类中断的实现 1.5.2一类中断的嵌套 1.5.3在StartOS之前的1类ISR 1.5.4使用1类中断时的注意事项 1.6中断源的初始化 1.…...

NFT Insider #167:Champions Tactics 角色加入 The Sandbox;AI 助力 Ronin 游戏生态

引言&#xff1a;NFT Insider 由 NFT 收藏组织 WHALE Members、BeepCrypto 联合出品&#xff0c; 浓缩每周 NFT 新闻&#xff0c;为大家带来关于 NFT 最全面、最新鲜、最有价值的讯息。每期周报将从 NFT 市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟…...

保姆级教程Docker部署KRaft模式的Kafka官方镜像

目录 一、安装Docker及可视化工具 二、单节点部署 1、创建挂载目录 2、运行Kafka容器 3、Compose运行Kafka容器 4、查看Kafka运行状态 三、集群部署 四、部署可视化工具 1、创建挂载目录 2、运行Kafka-ui容器 3、Compose运行Kafka-ui容器 4、查看Kafka-ui运行状态 …...

堆的实现——堆的应用(堆排序)

文章目录 1.堆的实现2.堆的应用--堆排序 大家在学堆的时候&#xff0c;需要有二叉树的基础知识&#xff0c;大家可以看我的二叉树文章&#xff1a;二叉树 1.堆的实现 如果有⼀个关键码的集合 K {k0 , k1 , k2 , …&#xff0c;kn−1 } &#xff0c;把它的所有元素按完全⼆叉树…...

git中文件的状态状态切换

文件的状态分类 Git 中文件的状态主要分为以下几种&#xff1a; Untracked&#xff08;未跟踪&#xff09; 定义&#xff1a;这些文件从未被 Git 跟踪过&#xff0c;通常是因为它们是新创建的文件&#xff0c;或者被 .gitignore 排除在外。 示例&#xff1a;新创建的文件 new…...

FreeRTOS学习笔记2:FreeRTOS的基础知识

1.FreeRTOS介绍 FreeRTOS是一个免费的嵌入式实时操作系统&#xff0c;同时它在市面上也是一款主流的操作系统&#xff0c;是工作上必不可少的技能。它具有以下六种特点&#xff1a; 1.免费开源&#xff1a;在商业产品中使用&#xff0c;无潜在商业风险&#xff0c;无需担心。 2…...

.NET 中实现生产者-消费者模型,BlockingCollection<T> 和 Channel<T>使用示例

一、方案对比&#xff1a;不同线程安全集合的适用场景 二、推荐方案及示例代码 方案 1&#xff1a;使用 BlockingCollection&#xff08;同步模型&#xff09; public class QueueDemo {private readonly BlockingCollection<int> _blockingCollection new BlockingCo…...

【OpenCV实战】基于 OpenCV 的多尺度与模板匹配目标跟踪设计与实现

文章目录 基于 OpenCV 的模板匹配目标跟踪设计与实现1. 摘要2. 系统概述3. 系统原理3.1 模板匹配的基本原理3.2 多尺度匹配 4. 逻辑流程4.1 系统初始化4.2 主循环4.3 逻辑流程图 5. 关键代码解析5.1 鼠标回调函数5.2 多尺度模板匹配 6. 系统优势与不足6.1 优势6.2 不足 7. 总结…...

算法--最长回文子串

给你一个字符串 s&#xff0c;找到 s 中最长的回文子串 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a;“aba” 同样是符合题意的答案。 示例 2&#xff1a; 输入&#xff1a;s “cbbd” 输出&#xff1a;“bb” 看似困难&…...

20250205确认荣品RK3566开发板在Android13下可以使用命令行reboot -p关机

20250205确认荣品RK3566开发板在Android13下可以使用命令行reboot -p关机 2025/2/5 16:10 缘起&#xff1a;荣品RK3566开发板在Android13下&#xff0c;希望通过Native C语言程序来控制RK3566的关机。 通过ADB&#xff0c;很容易通过reboot -p命令关机。 最开始以为需要su/root…...

java进阶专栏的学习指南

学习指南 java类和对象java内部类和常用类javaIO流 java类和对象 类和对象 java内部类和常用类 java内部类精讲Object类包装类的认识String类、BigDecimal类初探Date类、Calendar类、SimpleDateFormat类的认识java Random类、File类、System类初识 javaIO流 java IO流【…...

Selenium记录RPA初阶 - 基本输入元件

防止自己遗忘&#xff0c;故作此为记录。 爬取网页基本元件并修改后爬取。 包含元件&#xff1a; elements: dict[str, str] {"username": None,"password": None,"email": None,"website": None,"date": None,"ti…...

每日Attention学习20——Group Shuffle Attention

模块出处 [MICCAI 24] [link] LB-UNet: A Lightweight Boundary-Assisted UNet for Skin Lesion Segmentation 模块名称 Group Shuffle Attention (GSA) 模块作用 轻量特征学习 模块结构 模块特点 使用分组(Group)卷积降低计算量引入External Attention机制更好的学习特征S…...

DeepSeek:全栈开发者视角下的AI革命者

目录​​​​​​​ DeepSeek&#xff1a;全栈开发者视角下的AI革命者 写在前面 一、DeepSeek的诞生与定位 二、DeepSeek技术架构的颠覆性突破 1、解构算力霸权&#xff1a;从MoE架构到内存革命 2、多模态扩展的技术纵深 3、算法范式的升维重构 4、重构AI竞争规则 三、…...

Docker 国内最新可用镜像源20250205

2年没用dockerhub了结果今天发现镜像无法拉取了&#xff0c;找了很多镜像都无效&#xff0c;连阿里云镜像都不行了&#xff0c;最后找到下面可以用的。 Docker镜像仓库备注hub.urlsa.us.kg可用http://hub.haod.eu.org可用http://hub.chxza.eu.org可用http://ccoc.eu.org部分地…...

OpenEuler学习笔记(十八):搭建企业云盘服务

要在 OpenEuler 上搭建企业云盘&#xff0c;可借助一些开源软件来实现&#xff0c;以下以 Nextcloud 为例详细介绍搭建步骤。Nextcloud 是一款功能丰富的开源云存储解决方案&#xff0c;支持文件共享、同步、协作等多种功能。 1. 系统环境准备 确保 OpenEuler 系统已更新到最…...

redis实际开发应用简单实现

短信登录 首先来看看登录与注册常规实现流程如下&#xff1a; 其中&#xff0c;很多网站都有手机号验证码登录功能 如百度 实现之前咱可以来验证码有啥特点&#xff1a;一定时间内过期、验证码随机、与手机号会唯一匹配 所以可以使用redis的string来实现更容易&#xff0c;k…...

2. K8S集群架构及主机准备

本次集群部署主机分布K8S集群主机配置主机静态IP设置主机名解析ipvs管理工具安装及模块加载主机系统升级主机间免密登录配置主机基础配置完后最好做个快照备份 2台负载均衡器 Haproxy高可用keepalived3台k8s master节点5台工作节点(至少2及以上)本次集群部署主机分布 K8S集群主…...

flutter 专题四十七 Flutter 应用启动流程分析

众所周知&#xff0c;任何应用程序的启动都是从main()函数开始的&#xff0c;Flutter也不例外&#xff0c;main.dart文件的main函数开始的&#xff0c;代码如下。 void main() > runApp(MyApp());main函数则调用的是runApp函数&#xff0c;源码如下。 void runApp(Widget …...

proxmox通过更多的方式创建虚拟机

概述 作为一名资深运维工程师&#xff0c;我们经常需要在 Proxmox 虚拟化平台上创建和管理虚拟机。本文将介绍三种不同的方式在 Proxmox 上创建 Ubuntu 虚拟机&#xff1a; 通过 Proxmox 命令创建虚拟机通过 Shell 脚本自动化创建虚拟机使用 Proxmox API 创建虚拟机 每种方式…...

阿里云 ubuntu22.04 中国区节点安装 Docker

下面是一份在 Ubuntu 22.04 (Jammy) 上&#xff0c;通过阿里云镜像源来安装并配置 Docker 的详细步骤示例&#xff0c;可在中国区阿里云节点使用&#xff1a; 一、卸载旧版本 (如已安装) 如果系统中已经安装了旧版 Docker (可能是 docker、docker-engine、docker.io、containe…...

Java 中 LinkedList 的底层源码

在 Java 的集合框架中&#xff0c;LinkedList是一个独特且常用的成员。它基于双向链表实现&#xff0c;与数组结构的集合类如ArrayList有着显著差异。深入探究LinkedList的底层源码&#xff0c;有助于我们更好地理解其工作原理和性能特点&#xff0c;以便在实际开发中做出更合适…...

【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR

文章目录 指令格式&#xff08;重点&#xff09;1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…...

【LeetCode】5. 贪心算法:买卖股票时机

太久没更了&#xff0c;抽空学习下。 看一道简单题。 class Solution:def maxProfit(self, prices: List[int]) -> int:cost -1profit 0for i in prices:if cost -1:cost icontinueprofit_ i - costif profit_ > profit:profit profit_if cost > i:cost iret…...

【玩转 Postman 接口测试与开发2_017】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(下)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十三章 契约测试与 API 接口验证8 导入官方契约测试集合9 契约测试集合的详细配置9.1 env-apiKey 的创建与设置9.2 env-workspaceId 的设置9.3 Mock 服务器及 env-server 的配置9.4 API 测试实例的配置…...

学习threejs,pvr格式图片文件贴图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️PVR贴图1.2 ☘️THREE.Mesh…...

【人工智能】通用人工智能 AGI

AGI 是 Artificial General Intelligence 的缩写&#xff0c;中文翻译为通用人工智能。与我们常见的**特定人工智能&#xff08;Narrow AI&#xff09;**不同&#xff0c;AGI 是一个更高深、更具野心的目标。 AGI&#xff08;人工通用智能&#xff09;的定义 通用人工智能&am…...

基于PostGIS的省域空间相邻检索实践

目录 前言 一、相关空间检索函数 1、ST_touches函数 2、ST_Intersects函数 3、ST_Relate函数 4、区别于对比 二、空间相邻检索实践 1、省域表相关介绍 2、相关省域相邻查询 3、全国各省份邻居排名 三、总结 前言 在当今数字化时代&#xff0c;地理空间数据的高效管理…...