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

Golang 设计模式

文章目录

  • 创建型模式
    • 简单工厂模式
      • 图形接口
      • 具体图形类:圆形
      • 具体图形类:矩形
      • 工厂类定义
      • 使用简单工厂模式
    • 抽象工厂模式
      • 1. 定义产品接口
      • 2. 定义具体产品实现类
      • 3. 定义抽象工厂接口
      • 4. 定义具体工厂实现类
      • 5. 使用抽象工厂创建对象并使用产品
    • 创建者模式
      • 1. 定义产品结构体
      • 2. 定义创建者接口和具体创建者结构体
      • 3. 定义指挥者结构体
      • 4. 使用创建者模式构建对象
    • 原型模式
      • 定义原型接口和实现类:
      • 使用原型模式创建对象:
    • 单例模式
    • 懒汉式单例(线程不安全)
      • 懒汉式单例(线程安全)
      • 饿汉式单例
  • 结构性模式
    • 外观行模式
      • DVD 播放器接口和实现
      • 投影仪接口和实现
      • 音响系统接口和实现
      • 外观类实现
      • 使用外观模式

创建型模式

简单工厂模式

简单工厂模式是一种创建型设计模式。它定义了一个工厂类,这个工厂类负责创建产品对象。客户端(使用产品的代码)只需要向工厂类请求所需的产品,而不需要知道产品是如何创建的,这样就将产品的创建和使用分离,使得代码的结构更加清晰。
假设我们要创建一个图形绘制工具,首先定义一个图形接口,然后有不同的图形类实现这个接口。

图形接口

type Shape interface {Draw()
}

具体图形类:圆形

type Circle struct{}func (c *Circle) Draw() {println("Drawing a circle")
}

具体图形类:矩形

type Rectangle struct{}func (r *Rectangle) Draw() {println("Drawing a rectangle")
}

工厂类定义

接着创建简单工厂类,用于生产不同的图形。

  type ShapeFactory struct{}func (f *ShapeFactory) CreateShape(shapeType string) Shape {if shapeType == "circle" {return &Circle{}} else if shapeType == "rectangle" {return &Rectangle{}}return nil}

使用简单工厂模式

在主函数或者其他客户端代码中,可以这样使用工厂类来获取产品(图形)并使用。

  func main() {factory := &ShapeFactory{}circle := factory.CreateShape("circle")circle.Draw()rectangle := factory.CreateShape("rectangle")rectangle.Draw()}

抽象工厂模式

抽象工厂方法模式是一种创建型设计模式,它提供了一种创建对象的方式,将对象的创建和使用分离,使得代码更具灵活性和可维护性。其核心在于有一个抽象工厂接口,该接口定义了创建一系列相关产品对象的抽象方法,然后由具体的工厂类来实现这些抽象方法,创建具体的产品对象。

1. 定义产品接口

首先,定义一系列相关的产品接口,比如这里假设有两种产品:ProductA和ProductB。

// ProductA接口,代表产品A的抽象
type ProductA interface {Use()
}// ProductB接口,代表产品B的抽象
type ProductB interface {Use()
}

接口中定义了Use方法,用于表示产品的使用行为,具体的产品实现类需要实现这个方法。

2. 定义具体产品实现类

接着,创建具体的产品实现类,分别实现ProductA和ProductB接口。

// ConcreteProductA1是ProductA接口的一个具体实现
type ConcreteProductA1 struct{}func (p *ConcreteProductA1) Use() {println("Using ConcreteProductA1")
}// ConcreteProductA2是ProductA接口的另一个具体实现
type ConcreteProductA2 struct{}func (p *ConcreteProductA2) Use() {println("Using ConcreteProductA2")
}// ConcreteProductB1是ProductB接口的一个具体实现
type ConcreteProductB1 struct{}func (p *ConcreteProductB1) Use() {println("Using ConcreteProductB1")
}// ConcreteProductB2是ProductB接口的另一个具体实现
type ConcreteProductB2 struct{}func (p *ConcreteProductB2) Use() {println("Using ConcreteProductB2")
}

这些具体产品类实现了各自接口的Use方法,定义了具体的使用行为,比如打印出不同的使用提示信息。

3. 定义抽象工厂接口

然后,定义抽象工厂接口,它声明了创建ProductA和ProductB的抽象方法。

// AbstractFactory接口,定义创建产品的抽象方法
type AbstractFactory interface {CreateProductA() ProductACreateProductB() ProductB
}

4. 定义具体工厂实现类

再创建具体的工厂实现类,实现抽象工厂接口,根据具体工厂的逻辑来创建对应的具体产品。

// ConcreteFactory1是AbstractFactory接口的一个具体实现,用于创建特定组合的产品
type ConcreteFactory1 struct{}func (f *ConcreteFactory1) CreateProductA() ProductA {return &ConcreteProductA1{}
}func (f *ConcreteFactory1) CreateProductB() ProductB {return &ConcreteProductB1{}
}// ConcreteFactory2是AbstractFactory接口的另一个具体实现,用于创建另一种组合的产品
type ConcreteFactory2 struct{}func (f *ConcreteFactory2) CreateProductA() ProductA {return &ConcreteProductA2{}
}func (f *ConcreteFactory2) CreateProductB() ProductB {return &ConcreteProductB2{}
}

在这些具体工厂类中,实现了CreateProductA和CreateProductB方法,分别返回对应的具体产品实例。

5. 使用抽象工厂创建对象并使用产品

func main() {// 使用ConcreteFactory1创建产品factory1 := &ConcreteFactory1{}productA1 := factory1.CreateProductA()productB1 := factory1.CreateProductB()productA1.Use()productB1.Use()// 使用ConcreteFactory2创建产品factory2 := &ConcreteFactory2{}productA2 := factory2.CreateProductA()productB2 := factory2.CreateProductB()productA2.Use()productB2.Use()
}

在main函数中,首先实例化了不同的具体工厂(这里是ConcreteFactory1和ConcreteFactory2),然后通过这些工厂分别创建对应的产品实例,并调用产品的Use方法来展示其使用行为。

优点

  • 解耦对象创建和使用:使得代码中创建对象的部分和使用对象的部分相互独立,便于维护和扩展。例如,当需要添加新的具体产品或者改变产品的创建逻辑时,只需要在对应的工厂类和产品类中修改,而不会影响到使用这些产品的其他代码。
  • 便于代码的复用和替换:可以方便地替换具体的工厂实现类,从而改变创建的产品组合,在不同的应用场景下复用相同的产品接口和使用逻辑。
    缺点
  • 增加代码复杂度:由于引入了抽象工厂、具体工厂、产品接口以及多个具体产品类等多层结构,代码的整体复杂度会有所增加,对于简单的应用场景可能显得有些 “大材小用”。
  • 不利于理解:对于不熟悉设计模式的开发者来说,初次接触抽象工厂方法模式时,理解其结构和运行流程可能需要花费一些时间。

创建者模式

创建者模式是一种创建型设计模式,它将一个复杂对象的构建过程和它的表示分离,使得同样的构建过程可以创建不同的表示。该模式适用于创建对象的过程较为复杂,需要多个步骤来完成,并且不同的配置或步骤组合能够生成不同形态的对象的场景。

1. 定义产品结构体

首先,定义要构建的复杂产品对象,这里以一个简单的 Computer(电脑)结构体为例,它包含多个部件属性。

type Computer struct {CPU    stringMemory stringStorage stringGPU    string
}

2. 定义创建者接口和具体创建者结构体

接着,创建创建者接口,它声明了构建产品各个部件以及获取最终产品的抽象方法。然后创建具体的创建者结构体,实现这些抽象方法来定义具体的构建逻辑。

// Builder接口,定义构建电脑各部件及获取最终电脑的方法
type Builder interface {BuildCPU()BuildMemory()BuildStorage()BuildGPU()GetComputer() *Computer
}// GamingComputerBuilder是实现Builder接口的具体创建者结构体,用于构建游戏电脑
type GamingComputerBuilder struct {computer Computer
}func (b *GamingComputerBuilder) BuildCPU() {b.computer.CPU = "Intel Core i9"
}func (b *GamingComputerBuilder) BuildMemory() {b.computer.Memory = "32GB DDR5"
}func (b *GamingComputerBuilder) BuildStorage() {b.computer.Storage = "1TB NVMe SSD"
}func (b *GamingComputerBuilder) BuildGPU() {b.computer.GPU = "NVIDIA RTX 4090"
}func (b *GamingComputerBuilder) GetComputer() *Computer {return &b.computer
}// OfficeComputerBuilder是实现Builder接口的另一个具体创建者结构体,用于构建办公电脑
type OfficeComputerBuilder struct {computer Computer
}func (b *OfficeComputerBuilder) BuildCPU() {b.computer.CPU = "Intel Core i5"
}func (b *OfficeComputerBuilder) BuildMemory() {b.computer.Memory = "16GB DDR4"
}func (b *OfficeComputerBuilder) BuildStorage() {b.computer.Storage = "512GB SATA SSD"
}func (b *OfficeComputerBuilder) BuildGPU() {b.computer.GPU = "Integrated Graphics"
}func (b *OfficeComputerBuilder) GetComputer() *Computer {return &b.computer
}

在上述代码中,GamingComputerBuilder 按照游戏电脑的配置来构建各个部件,而 OfficeComputerBuilder 则按照办公电脑的配置进行构建,它们都实现了 Builder 接口的抽象方法,最后通过 GetComputer 方法返回构建好的电脑对象。

3. 定义指挥者结构体

指挥者结构体用于控制构建过程,它接收一个创建者对象,并按照特定顺序调用创建者的构建方法来完成产品的构建。

// Director结构体,用于协调构建过程
type Director struct {builder Builder
}func (d *Director) Construct() *Computer {d.builder.BuildCPU()d.builder.BuildMemory()d.builder.BuildStorage()d.builder.BuildGPU()return d.builder.GetComputer()
}

4. 使用创建者模式构建对象

最后,在 main 函数中展示如何使用创建者模式来构建不同类型的电脑对象。

func main() {// 创建游戏电脑gamingBuilder := &GamingComputerBuilder{}gamingDirector := &Director{builder: gamingBuilder}gamingComputer := gamingDirector.Construct()println("Gaming Computer Configuration:")println("CPU:", gamingComputer.CPU)println("Memory:", gamingComputer.Memory)println("Storage:", gamingComputer.Storage)println("GPU:", gamingComputer.GPU)// 创建办公电脑officeBuilder := &OfficeComputerBuilder{}officeDirector := &Director{builder: officeBuilder}officeComputer := officeDirector.Construct()println("\nOffice Computer Configuration:")println("CPU:", officeComputer.CPU)println("Memory:", officeComputer.Memory)println("Storage:", officeComputer.Storage)println("GPU:", officeComputer.GPU)
}

在 main 函数中,先分别实例化了游戏电脑和办公电脑对应的创建者和指挥者,然后通过指挥者调用构建过程来获取构建好的电脑对象,并打印出它们的配置信息。
优点

  • 解耦构建过程和产品表示:使得构建复杂对象的代码与对象本身的结构和表示分离,方便对构建过程进行修改和扩展,而不影响产品的使用逻辑。
  • 便于精细化控制构建过程:可以通过指挥者精确地控制构建步骤的顺序,并且能够根据不同需求灵活地使用不同的创建者来构建多种形态的产品。
  • 提高代码可读性和可维护性:将复杂的构建逻辑封装在创建者和指挥者中,使得代码结构更加清晰,易于理解和维护,尤其是在构建过程涉及多个步骤和多种配置的情况下。
    缺点
  • 增加代码复杂度:引入了创建者、指挥者等额外的结构体和接口,相比简单直接创建对象的方式,代码结构变得更复杂,对于简单的创建对象场景可能会显得有些繁琐。
  • 需要额外的代码管理:要维护创建者、指挥者以及它们与产品之间的关系,需要更多的代码来进行管理和协调,增加了一定的开发成本。

原型模式

原型模式是一种创建型设计模式。它的核心思想是通过复制一个已经存在的对象(原型)来创建新的对象,而不是通过传统的使用构造函数来初始化对象。这就好比是克隆,以一个原始对象为蓝本,快速制造出与其相似的新对象。

定义原型接口和实现类:

首先定义一个原型接口,这个接口有一个方法用于克隆对象。假设我们要创建一个图形的原型模式,接口如下:

type Shape interface {Clone() Shape
}

然后创建具体的图形类实现这个接口。以矩形(Rectangle)为例:

type Rectangle struct {width  float64height float64
}
func (r *Rectangle) Clone() Shape {return &Rectangle{width:  r.width,height: r.height,}
}

使用原型模式创建对象:

在主函数或者其他需要创建对象的地方,可以这样使用原型模式。

func main() {originalRectangle := &Rectangle{width: 10, height: 20}clonedRectangle := originalRectangle.Clone().(*Rectangle)// 验证克隆后的对象是否和原对象相同(除了内存地址)if originalRectangle.width == clonedRectangle.width && originalRectangle.height == clonedRectangle.height {println("克隆成功")}
}

单例模式

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。就好像在一个应用程序中,某些资源(如数据库连接池、配置管理器等)只需要一个实例存在,以避免资源浪费或数据不一致等问题。

懒汉式单例(线程不安全)

这种方式是在第一次调用获取实例的方法时才创建实例。

type Singleton struct{}var instance *Singletonfunc GetInstance() *Singleton {if instance == nil {instance = &Singleton{}}return instance
}

懒汉式单例(线程安全)

为了解决上述问题,可以使用互斥锁来保证在多线程环境下的安全。

import ("sync"
)type Singleton struct{}var (instance *Singletonmutex    sync.Mutex
)func GetInstance() *Singleton {mutex.Lock()defer mutex.Unlock()if instance == nil {instance = &Singleton{}}return instance
}

这里使用了sync.Mutex互斥锁,在获取实例的方法中,先加锁,然后判断实例是否为nil,如果是则创建实例,最后解锁。这样就保证了在多线程环境下只有一个实例被创建。

饿汉式单例

这种方式是在程序启动时就创建好实例,而不是等到第一次调用获取实例的方法时。

type Singleton struct{}var instance = &Singleton{}func GetInstance() *Singleton {return instance
}

结构性模式

外观行模式

外观模式(Facade Pattern)是一种结构型设计模式。它为复杂的子系统提供了一个统一的、简化的接口,隐藏了子系统的复杂性和内部实现细节。就好像给一个复杂的机器(子系统)安装了一个简单的控制面板(外观类),用户通过操作这个控制面板就能轻松地使用机器,而无需了解机器内部复杂的结构和运作原理。

假设场景:家庭影院系统
家庭影院系统通常包括多个复杂的子系统,如 DVD 播放器、投影仪、音响系统等。首先定义这些子系统的接口和实现。

DVD 播放器接口和实现

type DVDPlayer interface {On()Off()Play(movie string)Stop()
}type dvdPlayer struct{}func (d *dvdPlayer) On() {println("DVD player is on")
}func (d *dvdPlayer) Off() {println("DVD player is off")
}func (d *dvdPlayer) Play(movie string) {println("Playing movie:", movie)
}func (d *dvdPlayer) Stop() {println("DVD player stopped")
}

投影仪接口和实现

type Projector interface {On()Off()Project(image string)
}type projector struct{}func (p *projector) On() {println("Projector is on")
}func (p *projector) Off() {println("Projector is off")
}func (p *projector) Project(image string) {println("Projecting image:", image)
}

音响系统接口和实现

type SoundSystem interface {On()Off()SetVolume(volume int)
}type soundSystem struct{}func (s *soundSystem) On() {println("Sound system is on")
}func (s *soundSystem) Off() {println("Sound system is off")
}func (s *soundSystem) SetVolume(volume int) {println("Setting sound volume to:", volume)
}

外观类实现

现在创建外观类来提供家庭影院系统的简单统一接口。

type HomeTheaterFacade struct {dvdPlayer  DVDPlayerprojector  ProjectorsoundSystem SoundSystem
}func NewHomeTheaterFacade() *HomeTheaterFacade {return &HomeTheaterFacade{dvdPlayer:  &dvdPlayer{},projector:  &projector{},soundSystem: &soundSystem{},}
}func (h *HomeTheaterFacade) WatchMovie(movie string) {h.dvdPlayer.On()h.projector.On()h.soundSystem.On()h.soundSystem.SetVolume(10)h.dvdPlayer.Play(movie)h.projector.Project("Movie Image")
}func (h *HomeTheaterFacade) EndMovie() {h.dvdPlayer.Stop()h.dvdPlayer.Off()h.projector.Off()h.soundSystem.Off()
}

使用外观模式

在主函数中,可以这样使用外观类来操作家庭影院系统。

  func main() {homeTheater := NewHomeTheaterFacade()homeTheater.WatchMovie("Avatar")homeTheater.EndMovie()}

相关文章:

Golang 设计模式

文章目录 创建型模式简单工厂模式图形接口具体图形类:圆形具体图形类:矩形工厂类定义使用简单工厂模式 抽象工厂模式1. 定义产品接口2. 定义具体产品实现类3. 定义抽象工厂接口4. 定义具体工厂实现类5. 使用抽象工厂创建对象并使用产品 创建者模式1. 定义…...

Matlab 具有周期性分布的死角孔的饱和空气多孔材料的声学特性

本文对直主孔含侧空腔(死角)的饱和空气多孔介质中的声传播进行了理论和数值研究。侧腔位于沿每个主孔周期性间隔的“节点”上。研究了侧向空腔分布中周期性的影响,并单独考虑了紧间隔死角的低频极限。结果表明,吸附系数和透射损失…...

maven 项目怎么指定打包后名字

在 Spring Boot 的 Maven 项目中,你可以通过配置 pom.xml 文件来指定打包后的文件名。具体步骤如下: 打开 pom.xml 文件:找到你的项目根目录下的 pom.xml 文件。 配置 finalName 属性:在 标签下,添加 属性来指定打包后…...

Java Web开发进阶——Spring Boot与Thymeleaf模板引擎

Thymeleaf 是一个现代化的、功能强大的 Java 模板引擎,常用于生成 Web 应用程序的视图。它与 Spring Boot 的集成十分方便,并且提供了丰富的功能,能够帮助开发者实现动态渲染数据、处理表单、页面控制等操作。下面,我们将详细探讨…...

论文笔记(四十七)Diffusion policy: Visuomotor policy learning via action diffusion(下)

Diffusion policy: Visuomotor policy learning via action diffusion(下) 文章概括5. 评估5.1 模拟环境和数据集5.2 评估方法论5.3 关键发现5.4 消融研究 6 真实世界评估6.1 真实世界Push-T任务6.2 杯子翻转任务6.3 酱汁倒入和涂抹任务 7. 实际双臂任务…...

开始使用Panuon开源界面库环境配置并手写VS2019高仿界面

1. Panuon环境配置 1.1. 通过Nuget 安装 Panuon.WPF.UI1.2. xaml引用命名空间1.3. using Panuon.WPF.UI; 2. VS2019 view 2.1. 设置窗体尺寸和title2.2. 添加静态资源 2.2.1. 什么是静态资源 2.3. 主Grid 2.3.1. 盒子模型2.3.2. 嵌套布局 3. 总结 1. Panuon环境配置 1.1. 通…...

新垂直电商的社交传播策略与AI智能名片2+1链动模式S2B2C商城小程序的应用探索

摘要:随着互联网技术的不断进步和电商行业的快速发展,传统电商模式已难以满足消费者日益增长的个性化和多元化需求。新垂直电商在此背景下应运而生,通过精准定位、用户细分以及深度社交传播策略,实现了用户群体的快速裂变与高效营…...

WPS计算机二级•表格函数计算

听说这里是目录哦 函数基础知识 相对绝对混合引用🌪️相对引用绝对引用混合引用 常用求和函数 SUM函数🌦️语法说明 函数快速求 平均数最值⚡平均数最值 实用统计函数 实现高效统计🌀COUNTCOUNTIF 实用文本函数 高效整理数据🌈RIG…...

ESP32S3官方例程如何使用

一、WIFI 找到app_wifi.c文件 wifi_config_t wifi_config; 把上面代码修改为下面代码 wifi_config_t wifi_config { .sta {.ssid DEFAULT_ESP_WIFI_SSID, //WIFI的SSID.password DEFAULT_ESP_WIFI_PASS, //WIFI密码.threshold.authmode WIFI_AUTH_WPA…...

新版 MacOS 无法从 /usr/local/lib 加载动态链接库的解决办法

自己编写的动态链接库在Unix规范下一般位于/usr/local/lib,在2023年及之前的MacOS版本中,直接将动态库安装到该位置即可在程序运行时加载,可是升级MacOS版本后,ld就报错。 错误现象 运行程序,报错 dyld[6376]: Libra…...

【Varnish】:解决 Varnish 7.6 CDN 静态资源缓存失效问题

项目场景: 在一个使用Varnish作为反向代理的Web应用中,我们依赖CDN(内容分发网络)来缓存静态资源(如图片、CSS、JavaScript文件等),以提高全球用户的访问速度并减轻源站服务器的负载。然而&…...

【记录】篡改猴插件下载网页m3u8视频

1.打开浏览器【管理扩展】页面(edge://extensions/),打开开发人员模式 2.Edge浏览器添加篡改猴插件 3.下载需要的脚本 可以从篡改猴首页找下载网站 https://www.tampermonkey.net/scripts.php?localezh_CN 4.安装成功重启浏览器&#x…...

PID控制器 (Proportional-Integral-Derivative Controller) 算法详解及案例分析

PID控制器 (Proportional-Integral-Derivative Controller) 算法详解及案例分析 目录 PID控制器 (Proportional-Integral-Derivative Controller) 算法详解及案例分析1. 引言2. PID控制器的基本概念2.1 PID控制器的定义2.2 PID控制器的核心思想2.3 PID控制器的应用领域 3. PID控…...

【Java设计模式-5】装饰模式:给咖啡加点“佐料”

今天咱们要探索一下Java世界里的装饰模式(Decorator Pattern)。为了让这个过程更加生动易懂,咱们就以大家都熟悉的咖啡饮品来举例吧,想象一下,你就是那个咖啡大师,要给顾客调制出各种独特口味的咖啡哦&…...

C++ using(八股总结)

using作用: 类型别名using声明using指示 类型别名 using 可以用来创建类型别名,替代传统的 typedef。这在定义复杂类型时尤其有用,例如模板类型。 // 使用 typedef 创建类型别名 typedef long long ll;// 使用 using 创建类型别名 using …...

《分布式光纤传感:架设于桥梁监测领域的 “智慧光网” 》

桥梁作为交通基础设施的重要组成部分,其结构健康状况直接关系到交通运输的安全和畅通。随着桥梁建设规模的不断扩大和服役年限的增长,桥梁结构的安全隐患日益凸显,传统的监测方法已难以满足对桥梁结构健康实时、全面、准确监测的需求。分布式…...

C++(5)

1.运算符重载 头文件 #ifndef MYSTRING_H #define MYSTRING_H#include <iostream> #include <cstring>using namespace std;class myString { private:char *str;//C风格字符串int size0; public:std::string s_str;//转换构造函数myString(const std::string &a…...

【进程与线程】程序和进程在内存中的表现

在计算机系统中&#xff0c;程序和进程是两个密切相关但又有本质区别的概念&#xff0c;尤其在内存中的表现上有显著不同&#xff1a; 在这张图中可以直观地看出程序和进程在内存中的结构区别。 基本定义 程序 程序 是一个 静态实体&#xff0c;表示一组写好的指令和数据的…...

个人主页搭建全流程(Nginx部署+SSL配置+DCDN加速)

前言 最近开始准备秋招&#xff0c;打算做一个个人主页&#xff0c;以便在秋招市场上更有竞争力。 目前&#xff0c;现有的一些搭建主页的博文教程存在以下一些问题&#xff1a; 使用Github Page进行部署&#xff0c;这在国内访问容易受阻使用宝塔面板等框架&#xff0c;功能…...

语音合成的预训练模型

语音合成的预训练模型 与 ASR(语音识别)和音频分类任务相比,语音合成的预训练模型检查点明显较少。在 Hugging Hub 上,可以找到近 300 个适合的检查点。 在这些预训练模型中,重点关注两种在 Huggingface Transformers 库中开箱即用的架构——SpeechT5 和 Massive Multili…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...