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

编码常见的 3类 23种设计模式——学习笔记

一、创建型(用于方便创建实例)

1. 单例模式

 优点:

       确保系统中只有一个实例存在,避免多个实例导致的资源冲突或数据不一致问题。例如,数据库连接池、线程池等全局资源管理器适合用单例实现。

        减少频繁创建和销毁对象的开销,尤其适用于需要重复使用的对象(如日志记录器、缓存系统)

缺点: 扩展性受限、职责过载

2. 工厂模式

使用场景: 创建对象过程比较复杂, 将复杂的实例创建封装起来,使用时只要通过工厂方法创建(DI)

工厂模式的优点

  1. 解耦创建与使用:将对象的创建逻辑从使用逻辑中分离,客户端无需知道具体创建过程。
  2. 遵循开闭原则:对扩展开放,对修改关闭,添加新产品时无需修改现有客户端代码。
  3. 提升可维护性:集中管理对象创建逻辑,便于维护和扩展。
  4. 减少重复代码:统一处理复杂对象创建,避免冗余代码。
  5. 便于替换和测试:支持依赖注入和模拟对象,提高测试灵活性。

工厂模式的缺点

  1. 职责过重:工厂类承担所有对象创建,可能变得臃肿。
  2. 扩展困难:添加新产品需修改工厂类,违反开闭原则。
  3. 类数量增加:每个产品需对应一个工厂类,增加系统复杂度。
  4. 不利于反射:静态工厂方法限制反射机制的使用。
  5. 抽象工厂适用范围有限:每个具体工厂只能创建一类产品。
典型应用场景
  1. 框架设计
    ASP.NET Core的依赖注入容器通过工厂模式管理服务实例。

  2. 数据库访问层
    根据配置动态切换SQL Server、MySQL或Oracle的数据访问实现。

  3. 游戏开发
    不同敌人类型(如僵尸、机器人)的创建由工厂统一管理。

  4. 插件系统
    通过工厂加载不同插件的具体实现,避免硬编码依赖。

3. 建造者模式
   *使用场景:

      a.初始化对象时有必填的参数

       b.对象创建后不允许修改属性

建造者模式的优点
  1. 封装性好
    客户端无需了解对象内部构建细节,只需通过建造者接口操作。

  2. 灵活性高
    支持通过不同建造者类生成不同产品表示,符合开闭原则。

  3. 可复用性强
    建造者类可复用,避免重复代码,提高开发效率。

  4. 分步构建
    允许分步骤构建复杂对象,便于管理和控制构建流程。

建造者模式的缺点
  1. 增加类数量
    需定义抽象建造者、具体建造者和指挥者类,增加系统复杂度。

  2. 内部修改困难
    产品内部结构变化时,需修改所有相关建造者类,维护成本高。

  3. 构建过程复杂
    若对象构建逻辑过于复杂,建造者类可能变得臃肿。

示例:
public class Person
{public string Name { get; }public int Age { get; }public string Address { get; }private Person(string name, int age, string address){Name = name;Age = age;Address = address;}public class Builder{private string _name;private int _age;private string _address;public Builder WithName(string name){_name = name;return this;}public Builder WithAge(int age){_age = age;return this;}public Builder WithAddress(string address){_address = address;return this;}public Person Build(){return new Person(_name, _age, _address);}}
}

4. 原型模式(克隆模式)

使用场景: 一个类不同对象的属性没有什么改变,使用克隆的方式来创建后面的类可以提高运行速度(深度克隆/浅度克隆)

* 浅拷贝只会复制对象中基本数据类型数据和引用对象的内存地址,不会递归地复制引用对象

using System;public class Person : ICloneable
{public string Name { get; set; }public int Age { get; set; }public Address Address { get; set; }public Person(string name, int age, Address address){Name = name;Age = age;Address = address;}public object Clone(){return new Person(Name, Age, (Address)Address.Clone());}public override string ToString(){return $"Name: {Name}, Age: {Age}, Address: {Address}";}
}public class Address : ICloneable
{public string Street { get; set; }public string City { get; set; }public string State { get; set; }public Address(string street, string city, string state){Street = street;City = city;State = state;}public object Clone(){return new Address(Street, City, State);}public override string ToString(){return $"{Street}, {City}, {State}";}
}public class Program
{public static void Main(){Address address = new Address("123 Main St", "Anytown", "CA");Person person1 = new Person("John Doe", 30, address);Person person2 = (Person)person1.Clone();Console.WriteLine(person1);Console.WriteLine(person2);person2.Name = "Jane Doe";person2.Age = 25;person2.Address.Street = "456 Elm St";Console.WriteLine(person1);Console.WriteLine(person2);}
}

二、结构型模式(7 种)

 1、适配器模式 (Adapter)

场景:接口不兼容的类协同工作(如调用第三方API)。 

  1. 需要使用一个已有的类,但其接口不符合需求。
  2. 想要创建一个可复用的类,与一些不相关或不可预见的类一起工作。
  3. 需要在不修改现有代码的情况下,使两个不兼容的接口协同工作。

实现:通过包装类转换接口。

示例:假设我们有一个旧的 LegacyRectangle 类,它用于绘制矩形,但它有一个不兼容的接口。而客户端希望使用一个标准的 IShape 接口来绘制形状。


// 客户端期望的接口
public interface IShape
{void Draw(int x1, int y1, int x2, int y2);
}// 已有的旧类(不兼容接口)
public class LegacyRectangle
{public void DrawRectangle(int x, int y, int width, int height){Console.WriteLine($"Drawing rectangle at ({x}, {y}) with width {width} and height {height}");}
}// 适配器类,将 LegacyRectangle 转换为 IShape 接口
public class RectangleAdapter : IShape
{private LegacyRectangle _legacyRectangle;public RectangleAdapter(LegacyRectangle legacyRectangle){_legacyRectangle = legacyRectangle;}// 实现 IShape 接口的方法public void Draw(int x1, int y1, int x2, int y2){int width = Math.Abs(x2 - x1);int height = Math.Abs(y2 - y1);_legacyRectangle.DrawRectangle(x1, y1, width, height);}
}// 客户端代码
public class Client
{public void Main(){// 创建旧的 LegacyRectangle 对象LegacyRectangle legacyRectangle = new LegacyRectangle();// 使用适配器将其包装为 IShape 接口IShape shape = new RectangleAdapter(legacyRectangle);// 客户端通过统一的 IShape 接口调用方法shape.Draw(10, 10, 50, 50);}
}

2、装饰器模式 (Decorator)

它允许你动态地给对象添加行为或功能,而无需修改其代码。装饰器模式通过创建一个包装对象(即装饰器)来包裹原始对象,从而实现功能扩展。

装饰器模式的应用场景

  1. 需要在不修改现有类的情况下动态地扩展其功能。
  2. 需要为对象添加多个独立的功能,而不是一次性继承所有功能。
  3. 希望避免使用子类化导致的类爆炸问题。

示例: 我们有一个数据仓储基类,里面有一个 DeleteAsync(long id) 的方法,但是有一个文章仓储删除数据时需要同时删除子内容数据。

 public class BaseRepository<T> : IRepository<T> where T : class{protected IDbConnection Db => _unitOfWork.Db;private readonly IUnitOfWork _unitOfWork;public BaseRepository(IUnitOfWork unitOfWork){_unitOfWork = unitOfWork;}/// <summary>/// 根据主键查询单个实体/// </summary> /// <returns></returns>public virtual async Task  QueryByIdAsync(object id, ){await Db.DeleteAsync<T>(id); }
}public class ArticleRepository: BaseRepository<Article>
{public ArticleRepository(IUnitOfWork unitOfWork) : base(unitOfWork){}/// <summary>/// 删除/// </summary>/// <param name="id"></param>/// <returns></returns>public async Task DeleteAsync(long id){using (var tran = Db.OpenTransaction()){try{await Db.DeleteAsync<Article>(x => x.Id == id);await Db.DeleteAsync<ArticleContent>(x => x.ArticleId == id);tran.Commit();}catch (Exception e){tran.Rollback();throw;}}}}
3、代理模式(Proxy Pattern)

它允许你通过一个代理对象来控制对另一个对象的访问。在某些场景下,直接访问目标对象可能会导致性能问题或复杂性增加,这时可以使用代理模式来延迟加载、缓存或保护目标对象。

示例:假设我们需要加载一张大图片,但直接加载可能会消耗大量内存或时间。为了避免不必要的资源浪费,我们希望只有在真正需要显示图片时才加载图片数据。这种情况下,可以使用代理模式来实现延迟加载。

using System;// 图片接口
public interface IImage
{void Display();
}// 真实图片类(目标对象)
public class RealImage : IImage
{private string _fileName;public RealImage(string fileName){_fileName = fileName;LoadFromDisk();}private void LoadFromDisk(){Console.WriteLine($"Loading image: {_fileName} from disk...");}public void Display(){Console.WriteLine($"Displaying image: {_fileName}");}
}// 图片代理类(代理对象)
public class ImageProxy : IImage
{private string _fileName;private RealImage _realImage; // 真实图片对象public ImageProxy(string fileName){_fileName = fileName;_realImage = null; // 初始时不加载真实图片}public void Display(){if (_realImage == null){// 延迟加载:首次调用 Display 时才创建真实图片对象_realImage = new RealImage(_fileName);}_realImage.Display();}
}// 客户端代码
class Program
{static void Main(string[] args){// 创建代理对象IImage image = new ImageProxy("large_image.jpg");// 第一次调用 Display,触发延迟加载Console.WriteLine("First call to Display:");image.Display();// 第二次调用 Display,直接使用已加载的真实图片对象Console.WriteLine("\nSecond call to Display:");image.Display();}
}

三、行为型(11 种)

1、观察者模式 (Observer Pattern)

它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。

典型应用场景
  1. GUI 事件监听器(如按钮点击事件)。
  2. 发布-订阅系统(如消息队列、事件总线)。
  3. 数据绑定(如 MVVM 框架中的视图和模型同步)。
using System;
using System.Collections.Generic;// 观察者接口
public interface IObserver
{void Update(string message);
}// 主题接口
public interface ISubject
{void Attach(IObserver observer);void Detach(IObserver observer);void Notify(string message);
}// 具体主题
public class ConcreteSubject : ISubject
{private List<IObserver> _observers = new List<IObserver>();public void Attach(IObserver observer){_observers.Add(observer);}public void Detach(IObserver observer){_observers.Remove(observer);}public void Notify(string message){foreach (var observer in _observers){observer.Update(message);}}public void SomeBusinessLogic(){Console.WriteLine("Subject: Doing some business logic...");Notify("State has changed!");}
}// 具体观察者
public class ConcreteObserver : IObserver
{private string _name;public ConcreteObserver(string name){_name = name;}public void Update(string message){Console.WriteLine($"Observer {_name} received message: {message}");}
}// 客户端代码
class ObserverWork:BackGroundService
{void ExcuteAsync(){var subject = new ConcreteSubject();var observer1 = new ConcreteObserver("Observer1");var observer2 = new ConcreteObserver("Observer2");subject.Attach(observer1);subject.Attach(observer2);subject.SomeBusinessLogic();subject.Detach(observer1);subject.SomeBusinessLogic();}
}
2、消费者模式 (Consumer Pattern)

生产者-消费者模型的设计模式。在这种模式中,生产者生成数据,而消费者消费数据。两者通过某种中间机制(如队列、缓冲区)进行解耦。

典型应用场景
  1. 多线程编程中的任务队列。
  2. 消息队列系统(如 RabbitMQ、Kafka)。
  3. 数据流处理(如实时日志分析)。
  • 观察者模式更关注的是对象之间的状态同步和通知机制。
  • 消费者模式更关注的是生产者和消费者之间的任务分发和解耦。

3、命令模式 (Command)

命令模式的应用场景

  1. 需要将请求的发起者和执行者解耦。
  2. 需要支持请求的撤销或重做功能。
  3. 需要支持命令队列或宏命令(批量执行多个命令)。
  4. 需要记录日志以便在系统崩溃时重新执行命令。

命令模式的核心思想

  • 命令接口:定义一个执行操作的接口。
  • 具体命令类:实现命令接口,封装接收者的操作。
  • 接收者类:真正执行命令的对象。
  • 调用者类(Invoker):负责调用命令对象的执行方法。
  • 客户端代码:创建具体的命令对象并将其绑定到接收者。

示例:假设我们正在开发一个智能家居控制系统。用户可以通过遥控器控制灯光的开关、调节亮度等操作。为了支持撤销和重做功能,我们可以使用命令模式来实现。

using System;
using System.Collections.Generic;// 命令接口
public interface ICommand
{void Execute(); // 执行命令void Undo();    // 撤销命令
}// 接收者类
public class Light
{private bool _isOn = false;private int _brightness = 50; // 默认亮度public void TurnOn(){_isOn = true;Console.WriteLine("Light is ON");}public void TurnOff(){_isOn = false;Console.WriteLine("Light is OFF");}public void SetBrightness(int brightness){_brightness = brightness;Console.WriteLine($"Brightness set to {_brightness}");}public void ResetBrightness(){_brightness = 50;Console.WriteLine($"Brightness reset to default (50)");}
}// 具体命令类:开灯
public class TurnOnLightCommand : ICommand
{private Light _light;public TurnOnLightCommand(Light light){_light = light;}public void Execute(){_light.TurnOn();}public void Undo(){_light.TurnOff();}
}// 具体命令类:关灯
public class TurnOffLightCommand : ICommand
{private Light _light;public TurnOffLightCommand(Light light){_light = light;}public void Execute(){_light.TurnOff();}public void Undo(){_light.TurnOn();}
}// 具体命令类:设置亮度
public class SetBrightnessCommand : ICommand
{private Light _light;private int _brightness;private int _previousBrightness;public SetBrightnessCommand(Light light, int brightness){_light = light;_brightness = brightness;}public void Execute(){_previousBrightness = _light.GetType().GetProperty("Brightness")?.GetValue(_light, null) as int? ?? 50;_light.SetBrightness(_brightness);}public void Undo(){_light.SetBrightness(_previousBrightness);}
}// 调用者类(遥控器)
public class RemoteControl
{private Stack<ICommand> _undoStack = new Stack<ICommand>();public void PressButton(ICommand command){command.Execute();_undoStack.Push(command);}public void PressUndoButton(){if (_undoStack.Count > 0){var command = _undoStack.Pop();command.Undo();}else{Console.WriteLine("Nothing to undo.");}}
}// 客户端代码
class Program
{static void Main(string[] args){Light light = new Light();ICommand turnOnCommand = new TurnOnLightCommand(light);ICommand turnOffCommand = new TurnOffLightCommand(light);ICommand setBrightnessCommand = new SetBrightnessCommand(light, 80);RemoteControl remote = new RemoteControl();// 开灯remote.PressButton(turnOnCommand);// 设置亮度为 80remote.PressButton(setBrightnessCommand);// 关灯remote.PressButton(turnOffCommand);// 撤销操作Console.WriteLine("\nUndoing last action...");remote.PressUndoButton();Console.WriteLine("\nUndoing another action...");remote.PressUndoButton();Console.WriteLine("\nUndoing one more action...");remote.PressUndoButton();Console.WriteLine("\nTrying to undo again...");remote.PressUndoButton();}
}
4、责任链模式 (Chain of Responsibility)

场景:动态指定请求处理对象(如审批流程)。
实现:处理器链依次传递请求,直到被处理。

相关文章:

编码常见的 3类 23种设计模式——学习笔记

一、创建型(用于方便创建实例) 1. 单例模式 优点&#xff1a; 确保系统中只有一个实例存在&#xff0c;避免多个实例导致的资源冲突或数据不一致问题。例如&#xff0c;数据库连接池、线程池等全局资源管理器适合用单例实现。 减少频繁创建和销毁对象的开销&#xff0c;尤其适…...

# 实时人脸性别与年龄识别:基于OpenCV与深度学习模型的实现

实时人脸性别与年龄识别&#xff1a;基于OpenCV与深度学习模型的实现 在当今数字化时代&#xff0c;计算机视觉技术正以前所未有的速度改变着我们的生活与工作方式。其中&#xff0c;人脸检测与分析作为计算机视觉领域的重要分支&#xff0c;已广泛应用于安防监控、智能交互、…...

x-cmd install | Slumber - 告别繁琐,拥抱高效的终端 HTTP 客户端

目录 核心优势&#xff0c;一览无遗安装应用场景&#xff0c;无限可能示例告别 GUI&#xff0c;拥抱终端 还在为调试 API 接口&#xff0c;发送 HTTP 请求而苦恼吗&#xff1f;还在各种 GUI 工具之间切换&#xff0c;只为了发送一个简单的请求吗&#xff1f;现在&#xff0c;有…...

apijson 快速上手

apijson是强大的工具&#xff0c;简化了CRUD的操作&#xff0c;只要有数据库表&#xff0c;就能自动生成RESTFUL接口。但初次上手也是摸索了很长时间&#xff0c;尤其是部署与使用上&#xff0c;这里尝试以初学者角度来说下&#xff1a; 一、好处 1、对于简单的应用&#xff…...

3D激光轮廓仪知识整理

文章目录 1.原理和应用场景1.1 相机原理1.1.1 测量原理1.1.2 相机激光器1.1.3 沙姆镜头1.1.4 相机标定1.1.5 中心线提取 1.2 应用场景1.2.1 测量相关应用1.2.2 缺陷检测相关应用 2.相机参数介绍及选型介绍2.1 成像原理2.2 原始图成像2.3 生成轮廓图2.4 相机规格参数2.4.1 单轮廓…...

Stable Diffusion+Pyqt5: 实现图像生成与管理界面(带保存 + 历史记录 + 删除功能)——我的实验记录(结尾附系统效果图)

目录 &#x1f9e0; 前言 &#x1f9fe; 我的需求 &#x1f527; 实现过程&#xff08;按功能一步步来&#xff09; &#x1f6b6;‍♂️ Step 1&#xff1a;基本图像生成界面 &#x1f5c3;️ Step 2&#xff1a;保存图片并显示历史记录 &#x1f4cf; Step 3&#xff1a…...

使用WasmEdge将InternLM集成到Obsidian,打造本地智能笔记助手

本文来自社区投稿&#xff0c;作者Miley Fu&#xff0c;WasmEdge Runtime 创始成员。 本文将介绍如何通过 WasmEdge 将书生浦语&#xff08;InternLM&#xff09;大模型部署在本地&#xff0c;并与 Obsidian 笔记软件集成&#xff0c;从而在笔记软件中直接利用大模型实现文本总…...

深入理解Softmax函数及其在PyTorch中的实现

Softmax函数简介 Softmax函数在机器学习和深度学习中&#xff0c;被广泛用于多分类问题的输出层。它将一个实数向量转换为概率分布&#xff0c;使得每个元素介于0和1之间&#xff0c;且所有元素之和为1。 Softmax函数的定义 给定一个长度为 K K K的输入向量 z [ z 1 , z 2 …...

JGraphT 在 Spring Boot 中的应用实践

1. 引言 1.1 什么是 JGraphT JGraphT 是一个用于处理图数据结构和算法的 Java 库,提供了丰富的图类型和算法实现。 1.2 为什么使用 JGraphT 丰富的图类型:支持简单图、多重图、伪图等多种图类型。强大的算法库:提供最短路径、最小生成树、拓扑排序等多种算法。易于集成:…...

java导入excel更新设备经纬度度数或者度分秒

文章目录 一、背景介绍二、页面效果三、代码0.pom.xml1.ImportDevice.vue2.ImportDeviceError.vue3.system.js4.DeviceManageControl5.DeviceManageUserControl6.Repeater7.FileUtils8.ResponseModel9.EnumLongitudeLatitude10.词条 四、注意点本人其他相关文章链接 一、背景介…...

视频设备轨迹回放平台EasyCVR远程监控体系落地筑牢国土监管防线

一、背景概述 我国土地资源遭违法滥用的现象愈发严峻&#xff0c;各类土地不合理利用问题频发。不当的土地开发不仅加剧了地质危害风险&#xff0c;导致良田受损、森林资源的滥伐&#xff0c;还引发了煤矿无序开采、城市开发区违建等乱象&#xff0c;给国家宝贵的土地资源造成…...

tree-sitter 的 grammar.js 编写方法

tree-sitter 的 grammar.js 编写方法 一、grammar.js 的作用是什么&#xff1f;二、基本结构三、关键词解释四、编写小技巧1. 起点是 source_file2. 所有规则名&#xff08;如 identifier, number&#xff09;都是 $ > ...3. 正则表达式用于定义词法规则&#xff08;终结符&…...

Git 实践笔记

这里写自定义目录标题 一、将当前改动追加到某次commit上二、git 强制修改分支位置 一、将当前改动追加到某次commit上 stash工作区中的当前改动 git stash假设需要修改的commit是 f744c32&#xff0c;将HEAD移动到需要改动的commit的父提交上 git rebase f744c32^ --interact…...

【特权FPGA】之数码管

case语句的用法&#xff1a; 计数器不断的计数&#xff0c;每一个num对应数码管一种数据的输出。实例通俗易懂&#xff0c;一目了然。 timescale 1ns / 1ps// Company: // Engineer: // // Create Date: // Design Name: // Module Name: // Project Name: //…...

Stable Diffusion 四重调参优化——项目学习记录

学习记录还原&#xff1a;在本次实验中&#xff0c;我基于 Stable Diffusion v1.5模型&#xff0c;通过一系列优化方法提升生成图像的质量&#xff0c;最终实现了图像质量的显著提升。实验从基础的 Img2Img 技术入手&#xff0c;逐步推进到参数微调、DreamShaper 模型和 Contro…...

遇到git提交报错:413

是因为提交文件过大导致内存溢出。 解决方法&#xff1a; 假设您的提交历史如下&#xff1a; Apply to .gitignore abcd123 当前提交 efgh456 包含node_modules的提交 ijkl789 较早的正常提交 您可以&#xff1a; 回退到添加node_modules之前的提交&#xff1a; bash App…...

关于nacos注册的服务的ip异常导致网关路由失败的问题

文章目录 关于nacos注册的服务的ip异常导致网关路由失败的问题相关处理方案为方案一:手动指定服务注册的 IP 地址方法二&#xff1a;设置优先使用的网络段方法三&#xff1a;指定网络接口方法四&#xff1a;忽略特定的网卡 备注 关于nacos注册的服务的ip异常导致网关路由失败的…...

大模型在初治CLL成人患者诊疗全流程风险预测与方案制定中的应用研究

目录 一、绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与内容 二、大模型技术与慢性淋巴细胞白血病相关知识 2.1 大模型技术原理与特点 2.2 慢性淋巴细胞白血病的病理生理与诊疗现状 三、术前风险预测与手术方案制定 3.1 术前数据收集与预处理 3.2 大模…...

【C++游戏引擎开发】第9篇:数学计算库GLM(线性代数)、CGAL(几何计算)的安装与使用指南

写在前面 两天都没手搓实现可用的凸包生成算法相关的代码&#xff0c;自觉无法手搓相关数学库&#xff0c;遂改为使用成熟数学库。 一、GLM库安装与介绍 1.1 vcpkg安装GLM 跨平台C包管理利器vcpkg完全指南 在PowerShell中执行命令&#xff1a; vcpkg install glm# 集成到系…...

408 计算机网络 知识点记忆(8)

前言 本文基于王道考研课程与湖科大计算机网络课程教学内容&#xff0c;系统梳理核心知识记忆点和框架&#xff0c;既为个人复习沉淀思考&#xff0c;亦希望能与同行者互助共进。&#xff08;PS&#xff1a;后续将持续迭代优化细节&#xff09; 往期内容 408 计算机网络 知识…...

基于Python脚本实现Flink on YARN任务批量触发Savepoint的实践指南

基于Python脚本实现Flink on YARN任务批量触发Savepoint的实践指南 一、背景与价值 在流计算生产环境中&#xff0c;Flink on YARN的部署方式凭借其资源管理优势被广泛采用。Savepoint作为Flink任务状态的一致性快照&#xff0c;承载着故障恢复、版本升级、作业暂停等重要场景…...

我可能用到的网站和软件

我可能用到的网站和软件 程序员交流的网站代码管理工具前端组件库前端框架在线工具人工智能问答工具学习的网站Windows系统电脑的常用工具 程序员交流的网站 csdn博客博客园 - 开发者的网上家园InfoQ - 软件开发及相关领域-极客邦掘金 (juejin.cn) 代码管理工具 GitHub 有时…...

FPGA状态机设计:流水灯实现、Modelsim仿真、HDLBits练习

一、状态机思想 1.概念 状态机&#xff08;Finite State Machine, FSM&#xff09;是计算机科学和工程领域中的一种抽象模型&#xff0c;用于描述系统在不同状态之间的转换逻辑。其核心思想是将复杂的行为拆解为有限的状态&#xff0c;并通过事件触发状态间的转移。 2.状态机…...

2024年第十五届蓝桥杯CC++大学A组--成绩统计

2024年第十五届蓝桥杯C&C大学A组--成绩统计 题目&#xff1a; 动态规划&#xff0c; 对于该题&#xff0c;考虑动态规划解法&#xff0c;先取前k个人的成绩计算其方差&#xff0c;并将成绩记录在数组中&#xff0c;记录当前均值&#xff0c;设小蓝已检查前i-1个人的成绩&…...

WinForm真入门(13)——ListBox控件详解

WinForm ListBox 详解与案例 一、核心概念 ‌ListBox‌ 是 Windows 窗体中用于展示可滚动列表项的控件&#xff0c;支持单选或多选操作&#xff0c;适用于需要用户从固定数据集中选择一项或多项的场景‌。 二、核心属性 属性说明‌Items‌管理列表项的集合&#xff0c;支持动…...

Kotlin 学习-集合

/*** kotlin 集合* List:是一个有序列表&#xff0c;可通过索引&#xff08;下标&#xff09;访问元素。元素可以在list中出现多次、元素可重复* Set:是元素唯一的集合。一般来说 set中的元素顺序并不重要、无序集合* Map:&#xff08;字典&#xff09;是一组键值对。键是唯一的…...

解决java使用easyexcel填充模版后,高度不一致问题

自定义工具&#xff0c;可以通过获取上一行行高设置后面所以行的高度 package org.springblade.modules.api.utils;import com.alibaba.excel.write.handler.RowWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.wr…...

数据结构与算法之ACM Fellow-算法4.3 最小生成树

数据结构与算法之ACM Fellow-算法4.3 最小生成树 加权图 是一种为每条边关联一个 权值 或是 成本 的图模型。这种图能够自然地表示许多应用。在一幅航空图中&#xff0c;边表示航线&#xff0c;权值则可以表示距离或是费用。在一幅电路图中&#xff0c;边表示导线&#xff0c;…...

使用POCO库进行ZIP压缩和解压

使用POCO库进行ZIP压缩和解压 POCO C Libraries提供了一个ZIP模块&#xff0c;可以方便地进行文件和数据流的压缩与解压操作。下面我将介绍如何使用POCO的ZIP模块进行这些操作。 1. 基本ZIP文件操作 压缩文件/目录到ZIP #include <Poco/Zip/Compress.h> #include <…...

自动驾驶的未来:多模态感知融合技术最新进展

作为自动驾驶领域的专业人士&#xff0c;我很高兴与大家分享关于多模态感知融合技术的前沿研究和实践经验。在迅速发展的自动驾驶领域&#xff0c;多模态感知融合已成为提升系统性能的关键技术。本文将深入探讨基于摄像头和激光雷达的多模态感知融合技术&#xff0c;重点关注最…...