系统架构设计师:设计模式概述
面向对象技术为软件技术带来新的发展。人们运用面向对象的思想分析系统、为系统建模并设计系统,最后使用面向对象的程序语言来实现系统。
但是面向对象的设计并不是一件很简单的事情,尤其是要设计出架构良好的软件系统更不容易。
为了提高系统的复用性,需要进行一些“额外”的设计(这里的额外并不是无用的,而是指业务领域之外),定义类的接口、规划类的继承结构、建立类与类之间的关系。
毋庸置疑,良好的设计可以让系统更容易地被复用、被移植和维护,而如何快速进行良好的设计则是设计模式要讨论的问题。
设计模式是软件架构设计师的必修课,设计模式中蕴含的思想是架构设计师必须掌握的。
一、设计模式概述
在 20 世纪 70 年代,Christopher Alexander 提出了城市建筑的模式,他认为:模式就是描述一个不断发生的问题和该问题的解决方案。
随后,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 写了一本著名的参考书《设计模式:可复用面向对象软件的基础》。
后人也因为这本书称这四个人为四人组,将这本书中描述的模式称为 GoF(Gang of Four)设计模式。
在这本书中,四人组将设计模式定义为:对被用来在特定场景下解决一般设计问题的类和互相通信的对象的描述。
通俗地说,可以把设计模式理解为对某一类问题的通用解决方案。
(一)设计模式的概念
设计模式旨在解决特定类型的问题。例如,工厂模式是为了解决类创建的问题,而适配器模式则是为了解决接口不匹配的问题。如果将解决A问题的设计模式使用在B问题上,结果肯定是不合适的。因此,在描述设计模式前,首先要清楚这个设计模式到底要解决什么样的问题。
设计模式提供了一套通用的解决方案,并非具体的实现方式。虽然GoF的书中主要使用C++来描述这些模式,但它们的思想可以适用于Java甚至非面向对象的语言。具体应用时可以根据实际情况进行相应的变化,比如,对于工厂模式就有很多种变化。
尽管设计模式的概念由GoF首次系统性地提出,但这些模式并非他们原创。实际上,这些模式是从众多成功的项目设计中抽象和提炼出来的。
学习设计模式不仅仅是学习模式本身,更重要的是理解模式中的思想。设计模式的目标是提高软件架构的质量。虽然设计模式中描述的大多是面向对象的低层设计方案,但其中包含的却是更广泛的软件设计理念,与软件架构风格相辅相成,如MVC框架既可视为一种设计模式也可看作一种架构风格。
设计模式应在适当的场景下使用,滥用会导致负面效果。首先,设计模式有其适用的场合,不合适的情况下使用会有害无益;其次,过度依赖设计模式可能不会增加软件的复用性,反而会使系统变得复杂且难以维护。因此,架构设计师需要明智地决定何时以及如何使用设计模式。
(二)设计模式的组成
在描述一个设计模式时,至少需要包含四个方面:模式名称、问题、解决方案、效果。这四个方面就是设计模式的四要素。
模式名称
每种设计模式都有自己的名字,也就是模式名称。名不正则言不顺,一个明确的名称有助于架构设计师快速理解模式的核心用途和适用场景。
问题
设计模式都有其应用的场合,即该设计模式意图解决的问题。超出了这个问题就不应该再应用这种模式,因此问题是设计模式的第二要素。正确识别模式所针对的具体问题对于避免误用至关重要。
解决方案
设计模式的目的就是解决问题,所以在描述设计模式时当然要有解决问题的方法描述。这是设计模式的另外一个要素——解决方案。它详细说明了如何使用特定的设计模式来应对已定义的问题。
效果
虽然架构设计师知道应用设计模式可以提高架构质量,提高软件的复用性,但对于每一种设计模式而言,还有其更具体的效果描述。所以设计模式的最后一个要素就是效果,它展示了采用该设计模式可能带来的正面或潜在负面的影响。
这四个要素是描述设计模式时必不可少的部分。
(三)GoF 设计模式
GoF(Gang of Four)的著作不仅首次总结了设计中的常用模式,还在学术上建立了软件设计模式的地位。因此,人们习惯上将GoF提出的23个模式统称为GoF模式。
(1)Factory Method模式
Factory Method模式提供了一种延迟创建类的方法,使用这个方法可以在运行期由子类决定创建哪一个类的实例。
(2)Abstract Factory模式
Abstract Factory模式,又称为抽象工厂模式,主要为解决复杂系统中对象创建的问题。它提供了一个一致的对象创建接口来创建一系列具有相似基类或相似接口的对象,是一种很有代表性的设计模式。
(3)Builder模式
Builder模式与Abstract Factory模式非常类似,但Builder模式是逐步地构造出一个复杂对象,并在最后返回对象的实例。它可以将复杂对象的创建与表示分离,使得同样的创建过程可以创建不同的表示。
(4)Prototype模式
Prototype模式可以根据原型实例制定创建的对象种类,并通过深复制这个原型来创建新的对象。它有着同Abstract Factory模式和Builder模式相同的效果,但在需要实例化的类是在运行期才被指定且要避免创建一个与产品曾是平行的工厂类层次时更为灵活。
(5)Singleton模式
Singleton模式也是一种很有代表性的模式,使用它可以保证一个类仅有一个实例,从而可以提供一个单一的全局访问点。
(6)Adapter模式
Adapter模式可以解决系统间接口不相容的问题。通过Adapter可以把类的接口转化为客户程序所希望的接口,从而提高复用性。
(7)Bridge模式
Bridge模式把类的抽象部分同实现部分相分离,这样类的抽象和实现都可以独立地变化。
(8)Composite模式
Composite模式提供了一种以树形结构组合对象的方法,使用它可以使得单个对象和组合后的对象具有一致性以提高软件的复用性。
(9)Decorator模式
Decorator模式可以动态地为对象的某一个方法增加更多的功能,在很多情况下使用它可以不必继承出新的子类从而维护简洁的类继承结构。
(10)Facade模式
Facade模式为一组类提供了一致的访问接口。使用Facade可以封装内部具有不同接口的类,使其对外提供统一的访问方式。
(11)Flyweight模式
Flyweight模式可以共享大量的细粒度对象,从而节省创建对象所需要分配的空间,不过在时间上的开销会变大。
(12)Proxy模式
顾名思义,Proxy模式为对象提供了一种访问代理,通过对象Proxy可以控制客户程序的访问,例如:访问权限的控制、访问地址的控制、访问方式的控制等。
(13)Interpreter模式
定义了一个解释器,来解释遵循给定语言和文法的句子。
(14)Template Method模式
定义一个操作的模板,其中的一些步骤会在子类中实现,以适应不同的情况。
(15)Chain of Responsibility模式
Chain of Responsibility模式把可以响应请求的对象组织成一条链,并在这条对象链上传递请求,从而保证多个对象都有机会处理请求而且可以避免请求方和相应方的耦合。
(16)Command模式
将请求封装为对象,从而增强请求的能力,如参数化、排队、记录日志等。
(17)Iterator模式
Iterator模式提供了顺序访问一个对象集合中的各元素的方法,使用Iterator可以避免暴露集合中对象的耦合关系。
(18)Mediator模式
Mediator模式可以减少系统中对象间的耦合性。它使用中介对象封装其他的对象,从而使这些被封装的对象间的关系就成了松散耦合。
(19)Memento模式
Memento模式提供了一种捕获对象状态的方法,且不会破坏对象的封装,并且可以在对象外部保存对象的状态,并在需要的时候恢复对象状态。
(20)Observer模式
Observer模式提供了将对象的状态广播到一组观察者的方式,从而可以让每个观察者随时可以得到对象更新的通知。
(21)State模式
State模式允许一个对象在其内部状态改变的时候改变它的行为。
(22)Strategy模式
使用Strategy模式可以让对象中算法的变化独立于客户。
(23)Visitor模式
表示对某对象结构中各元素的操作,使用Visitor模式可以在不改变各元素类的前提下定义作用于这些元素的新操作。
(四)其他设计模式
在GoF之后,人们继续对设计模式进行发掘,总结出更多的设计模式。在J2EE应用领域,人们也对使用J2EE框架开发的应用程序总结出一系列设计模式。因为这些设计模式是同J2EE技术紧密相关的,所以介绍中将会使用一些J2EE技术术语。
(1)Intercepting Filter模式
在J2EE的BPS(Basic Programming System,基本编程系统)应用框架下,在真正响应客户端请求前经常需要进行一些预处理,如客户身份验证、客户Session的合法性验证、字符集转码、客户请求记录等。
当然可以将这些请求预处理在每一个Servlet中,不过这样的话预处理的代码就“侵入”了真正的处理程序,使得代码变得更加难以维护。
Intercepting Filter模式提供了解决这个问题的方法。它通过截取客户请求,并将请求发送到Filter链中,一步一步地进行预处理,直到这些处理结束,请求才会被转发到真正响应客户请求的Servlet中。
(2)Session Facade模式
Session Facade模式广泛应用于EJB开发的J2EE应用程序中。EJB是一种分布式构件,EJB的客户端需要通过EJB容器调用EJB,即使EJB的客户端同EJB部署于同一台机器,对EJB的调用也许要通过网络接口进行远程调用。
因此,在开发EJB时,需要尽量减少对EJB调用的次数以提高性能。同时为了提高EJB构件的可维护性和复用性,应该尽量将EJB构件的接口设计得一致。
在GoF设计模式中就有Facade模式提高接口的一致性,在J2EE开发领域,人们把Session Bean和Facade模式结合起来,封装业务逻辑的接口,形成了Session Facade模式。这样不仅提高了系统的性能,还增强了系统的可维护性和复用性。
(五)设计模式与软件架构
软件架构描述了软件的组成,例如,经典的“4+1”视图,将软件架构通过逻辑视图、开发视图、进程视图、物理视图及场景视图来进行描述。在这些视图中,描述了软件系统中类之间的关系、进程之间的关系、软件和硬件的结合等问题。一般来说,软件架构更倾向于从整体和全局上描述软件的组成。
而设计模式则更侧重于类与类、对象与对象之间的关系。例如在逻辑视图中,可以使用多种设计模式来组织类与类之间的关系。因此,有很多人认为,设计模式和软件架构是面向不同层次问题的解决方案。
同设计模式一样,软件架构也有一些固定的模式,通常称为架构风格。常见的架构风格有分层架构、客户端—服务器架构、消息总线、面向服务的架构(Service-Oriented Architecture,SOA)等。
软件架构风格同设计模式在某种含义上是一致的。设计模式和软件架构中蕴含的很多思想是一致的。无论是架构风格还是设计模式,人们在追求良好设计的过程中,将一些常见解决方案总结、整理出来,形成固定的风格与模式。例如消息总线的架构风格同Observer模式就有神似之处。
因此,掌握设计模式对于软件架构设计有非常大的帮助。通过理解并应用这些模式和风格,开发者能够在不同的抽象层次上构建更加健壮、灵活和易于维护的系统。
(六)设计模式分类
可以说,设计模式是面向问题的,即每一种设计模式都是为了解决一种特定类型的问题。因此,根据设计模式要解决的问题将设计模式分为三类,分别为创建型、结构型和行为型。
事实上,面向对象的设计中,需要解决的就是:如何管理系统中的对象、如何组织系统中的类与对象、系统中的类与对象如何相互通信。这三类设计模式分别解决了这三个方面的问题。
创建型设计模式主要解决对象创建的问题。在最简单的情况下,在程序中定义类,在使用时创建一个对象实例。但在实际开发中,对象的创建会变得复杂很多,这时就需要使用创建型设计模式解决创建对象的问题。
随着开发系统的不断扩张,系统功能更加丰富,模块之间的复用越来越多,系统中类与对象的结构变得更加复杂。如果缺乏良好的设计,这些类之间的关系将会变得非常混乱。结构型设计模式就是为了解决这些问题的。
除了这种分类方法外,GoF还提出了可以根据设计模式主要应用于类还是对象来对设计模式进行分类,对于这种分类方法就不再赘述了。
GoF 模式分类:
应用范围 | 创建型 | 结构型 | 行为型 |
---|---|---|---|
应用于类 | Factory Method | Adapter | Interpreter Template Method |
应用于对象 | Abstract Factory Builder Prototype Singleton | Adapter Bridge Composite Decorator Facade Flyweight Proxy | Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor |
随着 GoF 设计模式的提出,后人也总结出了更多的良好设计的范本,并根据其他的方法进行分类。
例如,在《Core J2EE Patterns》一书中,作者将书中列举的 Design Pattern 分为表现层模式、业务层模式和综合层模式。
根据这种分类方法,可以得到应用于 J2EE 框架的设计模式图谱,如表 所示。
表现层 | 业务层 | 综合层 |
---|---|---|
Intercepting Filter | Business Delegate | Data Access Object |
Front Controller | Value Object | Service Activator |
View Helper | Session Facade | |
Composite View | Composite Entity | |
Service to Worker | Value Object Assembler | |
Dispatcher View | Value List Handler | |
Service Locator |
相关文章:
系统架构设计师:设计模式概述
面向对象技术为软件技术带来新的发展。人们运用面向对象的思想分析系统、为系统建模并设计系统,最后使用面向对象的程序语言来实现系统。 但是面向对象的设计并不是一件很简单的事情,尤其是要设计出架构良好的软件系统更不容易。 为了提高系统的复用性…...
天山流域流量数据集(1991-2019)
时间分辨率日空间分辨率/共享方式开放获取数据大小131.67 MB数据时间范围 1901-01-01 — 2019-12-31 元数据更新时间2025-03-24 数据集摘要 由于天山地区数据稀缺和水文条件复杂,中亚水塔的自然径流数据集在各种全球径流数据集(如GMIS、GRDC)…...
Linux 环境下 Mysql 5.7 数据定期备份
目录 一、创建数据备份脚本二、查看备份日志三、数据库数据恢复 备份策略: 系统环境 openEuler 22.03 (LTS-SP4) 单机备份 每天凌晨2点,指定数据库表全量备份,只保留近7次备份数据 每次的脚本执行,将会记录执行结果到日志…...
多模态大语言模型arxiv论文略读(五十二)
M3D: Advancing 3D Medical Image Analysis with Multi-Modal Large Language Models ➡️ 论文标题:M3D: Advancing 3D Medical Image Analysis with Multi-Modal Large Language Models ➡️ 论文作者:Fan Bai, Yuxin Du, Tiejun Huang, Max Q. -H. M…...
REST API、FastAPI与Flask API的对比分析
以下是关于REST API、FastAPI与Flask API的对比分析,涵盖架构设计、性能表现、开发效率等核心维度: 一、核心定位与架构差异 REST API 本质:一种基于HTTP协议的架构风格,强调资源化操作(通过URI定位资源)、…...
【论文阅读26】贝叶斯-滑坡预测-不确定性
📖 这篇论文主要说了什么? 📌 背景: 滑坡预测里,预测失稳时间(Slope Failure Time, SFT) 很关键,但它受两方面不确定性影响: 观测不确定性(监测数据本身的…...
【笔记】深度学习模型训练的 GPU 内存优化之旅④:内存交换与重计算的联合优化篇
开设此专题,目的一是梳理文献,目的二是分享知识。因为笔者读研期间的研究方向是单卡上的显存优化,所以最初思考的专题名称是“显存突围:深度学习模型训练的 GPU 内存优化之旅”,英文缩写是 “MLSys_GPU_Memory_Opt”。…...
边缘计算革命:大模型轻量化部署全栈实战指南
当ResNet-152模型能在树莓派4B上实现每秒27帧实时推理时,边缘智能时代真正到来。本文解析从模型压缩到硬件加速的完整技术栈,实测Transformer类模型在移动端的部署时延可压缩至16ms,揭示ARM芯片实现INT4量化的工程秘诀与十种典型场景优化方案…...
LangChain4j +DeepSeek大模型应用开发——7 项目实战 创建硅谷小鹿
这部分我们实现硅谷小鹿的基本聊天功能,包含聊天记忆、聊天记忆持久化、提示词 1. 创建硅谷小鹿 创建XiaoLuAgent package com.ai.langchain4j.assistant;import dev.langchain4j.service.*; import dev.langchain4j.service.spring.AiService;import static dev…...
python自动化测试
Python自动化测试指南 Python是自动化测试领域的首选语言之一,凭借其简洁的语法、丰富的库和强大的生态系统,能够高效地实现各种测试需求。本文将详细介绍Python在自动化测试中的应用,涵盖Web测试、API测试、单元测试、GUI测试等多个方面。 1. 自动化测试基础 测试金字塔…...
49、【OS】【Nuttx】【OSTest】参数解析:测试项
背景 接之前 blog 48、【OS】【Nuttx】【OSTest】内存监控:分配释放推演 解析完内存监控,继续看下一个测试项 getopt_test 测试项 getopt_test 如下 getopt,getopt_long,getopt_long_only getopt() 用来解析命令行短选项&am…...
String StringBuilder StringBuffer
文章目录 StringStringBuilderStringBuffer StringStringBuilderStringBuffer可变性不可变可变可变线程安全安全(天然不可变)不安全安全(同步方法)性能低(频繁操作生成新对象)高中(同步开销&…...
[FPGA 官方 IP] Binary Counter
Xilinx Binary Counter IP (PG121) 详细介绍 概述 Xilinx Binary Counter IP(二进制计数器 IP)是 AMD Xilinx 提供的 LogiCORE™ IP 核,用于在 FPGA 中实现高性能、面积高效的二进制计数器。该 IP 核支持上行计数器、下行计数器以及上/下计…...
【大模型实战篇】华为信创环境采用vllm部署QwQ-32B模型
1. 背景 本文分享在华为昇腾机器上部署QwQ-32B模型的实践。 首先华为自己是提供了一套在信创机器(NPU)上部署模型的方案【1】,但是部署之后,测试发现会有输出截断的现象。QwQ-32B本身是支持128k的最大上下文长度,定位…...
优雅关闭服务:深入理解 SIGINT / SIGTERM 信号处理机制
目录 为什么需要优雅关闭? 什么是 SIGINT 和 SIGTERM? 如何实现优雅关闭(以 C 为例) 示例代码(gRPC 服务 Boost 信号监听): 优雅关闭时的清理内容通常包括: 与 SIGKILL 的区别…...
2025五一杯数学建模竞赛选题建议+初步分析
完整内容请看文章最下面的推广群 2025五一杯数学建模竞赛选题建议初步分析 提示:C君认为的难度和开放度评级如下: 难度:B题 > A题 > C题,开放度:B题 > C题 > A题。综合来看:A题目标明确,数据…...
自动剪辑批量混剪视频过原创软件工具视频帧级处理技术实践批量截图解析
一、引言:视频素材精细化处理的技术需求 在视频内容生产与分析场景中,高效的帧级处理是素材解构的核心环节。本文结合实战经验,解析基于智能帧截取算法、参数化配置系统、多线程并行处理的批量帧处理技术方案,构建可复用的工程化…...
GD32F407单片机开发入门(二十五)HC-SR04超声波模块测距实战含源码
文章目录 一.概要二.HC-SR04主要参数1.模块引脚定义2.模块电气参数3.模块通讯时序4.模块原理图 三.GD32单片机超声波模块测距实验四.工程源代码下载五.小结 一.概要 HC-SR04超声波模块常用于机器人避障、物体测距、液位检测、公共安防、停车场检测等场所。HC-SR04超声波模块主…...
C++11新特性_Lambda 表达式
Lambda 表达式是 C11 引入的一项重要特性,它允许你在代码中创建匿名函数对象。Lambda 表达式为编写简洁、灵活的代码提供了便利,尤其适用于函数式编程和需要传递简短回调函数的场景。下面从基本语法、捕获列表、使用场景等方面详细介绍 Lambda 表达式。 …...
vue中$set原理
Vue 中的 $set 方法(Vue.set)主要用于 向响应式对象中添加一个新的属性,并确保这个新属性是响应式的,能够触发视图更新。 📌 背景问题:为什么需要 $set? 在 Vue 2 中,直接给对象新增…...
【C++重载操作符与转换】输入和输出操作符
目录 一、输入输出操作符概述 二、输入输出操作符重载的原理 2.1 为什么需要重载? 2.2 重载的限制 2.3 重载的方式 三、输入输出操作符重载的实现 3.1 输出操作符 << 的重载 3.2 输入操作符 >> 的重载 四、输入输出操作符重载的注意事项 4.1 …...
Vue 生命周期全解析:理解组件从创建到销毁的全过程
Vue 生命周期全解析:理解组件从创建到销毁的全过程 Vue.js 是一个流行的前端框架,它通过“组件化开发”提升了代码组织效率。要真正掌握 Vue,生命周期(Lifecycle) 是一个必须深入理解的核心概念。生命周期不仅决定了组…...
MySQL零基础入门:Ubuntu环境安装与操作精解
知识点1【数据库】 数据的存储方式,我们之前学的,从变量,数组,链表,最后到文件,文件之上,便是数据库,而我们要介绍的MySQL就是数据库的关系数据库中的其中一种。 1、数据库 本质&…...
【计算机视觉】语义分割:Mask2Former:统一分割框架的技术突破与实战指南
深度解析Mask2Former:统一分割框架的技术突破与实战指南 技术架构与创新设计核心设计理念关键技术组件 环境配置与安装指南硬件要求安装步骤预训练模型下载 实战全流程解析1. 数据准备2. 配置文件定制3. 训练流程4. 推理与可视化 核心技术深度解析1. 掩膜注意力机制…...
Qt二维码demo
使用QZXing库生成的二维码demo 运行结果 实现代码 c文件 #include "mainwindow.h" #include "ui_mainwindow.h" #include "src/myqrcodeheader.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui-&…...
Java 基础--数组(Array):存储数据的“排排坐”
作者:IvanCodes 发布时间:2025年5月1日🤓 专栏:Java教程 大家好!👋 咱们在编程时,经常需要处理一批相同类型的数据,比如班级里所有同学的成绩 💯、一周每天的最高气温 …...
OpenGL-ES 学习(10) ---- OpenGL-ES Shader语言语法
目录 Shader 举例Shader 语法版本规范声明变量和定法方法向量构造方法矩阵构造方法结构,数组,函数定义结构数组函数 内建函数条件语句和运算符统一变量统一变量块Shader 输入输出插值限定符预处理命令精度限定符不变性 Shader 举例 一个典型的简单的 Sh…...
Unity SpriteAtlas (精灵图集)
🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎为什么要打图集? 💡打图集的目的就是减少DrawCall 提高性能 &a…...
(33)VTK C++开发示例 ---图片转3D
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 这是 VTK 测试 clipArt.tcl 的改编版本。 提供带有 2D 剪贴画的 jpg 文件,该示例将创建 3D 多边形数据模…...
RAG工程-基于LangChain 实现 Advanced RAG(预检索-查询优化)(上)
Enrich 完善问题 完善问题流程概述 问题转述 在典型RAG架构中,用户问题的质量直接影响检索系统的表现。研究表明,未经优化的自然语言查询会导致: 关键实体识别缺失 语义漂移导致召回偏离 长尾问题检索失败率升高 大多数用户并非提示词工程…...
交我算使用保姆教程:在计算中心利用singularity容器训练深度学习模型
文章目录 准备工作步骤如何封装和使用容器安装创建 Singularity 容器编写 def 文件构建容器查看构建容器的 python 版本本地测试挂载数据集和代码 如何上传数据windows 系统Linux 系统 如何设置作业任务脚本的结构常用的 Slurm 参数一份完整的 slurm 作业示例 如何在 debug 队列…...
CMake中强制启用option定义变量的方法
在CMake中,若要在另一个CMake文件中强制启用由option()定义的变量,可使用set(... FORCE)覆盖缓存变量。具体步骤如下: 使用set命令强制覆盖缓存: 在需要强制启用选项的CMake文件中,使用set命令并指定CACHE和FORCE参数。…...
图解 Git 工作流:理解 Rebase、Merge 与 Pull Request 的区别
图解 Git 工作流:理解 Rebase、Merge 与 Pull Request 的区别 在多人协作开发中,选择合适的 Git 分支管理策略至关重要。Merge、Rebase 和 Pull Request 是最常见的三种方式,它们本质不同,使用场景也不同。 本文将通过流程图&am…...
图与网络模型
目录 图的基本概念 例题:比赛的安排 MATLAB作图 最短路径模型 Dijkstra算法步骤 最短路径的Dijkstra算法示例 Dijkstra算法的Matlab函数 最短路径的Floyd算法模型 最短路径的Floyd算法步骤 Floyd算法的Matlab函数 图的基本概念 图G是一个二重组: …...
连接linux虚拟机并运行C++【从0开始】
连接linux虚拟机并运行C【从0开始】 NetSarang安装后两个,其实更加常用的 安装VMware安装Ubuntu 的 ISO 镜像VMWare--TipsUbuntu快捷键,可以在设置里面修改 连接Linux运行cwhy剪不断,理还乱操作 因为好多判题系统,后台都是Linux环…...
多线程系列二:Thread类
Thread类是jvm用来管理线程的一个类,换句话说,每个线程都有一个唯一的Thread对象与之关联 1.Thread常见构造方法 Thread():创建线程对象Thread(Runnable target):使用Runnable对象创建线程对象Thread(String name):创…...
2025五一杯数学建模C题:社交媒体平台用户分析问题,完整第一问模型与求解+代码
完整代码模型请见文末名片 • 问题1分析: – 来龙去脉和与其他问题的内在联系: • 来龙去脉:社交媒体平台为了评估博主的价值,合理分配资源和优化内容推荐,需要准确预测博主的新增关注数。新增关注数是衡量博主影响…...
开源飞控软件:推动无人机技术进步的引擎
在过去的二十年里,众多开源自动驾驶仪项目极大地推动了无人机技术的发展。像 MatrixPilot、Baseflight、TauLabs、OpenPilot、Cleanflight、MultiWii 和 dRonin 等一些开源自动驾驶仪项目已经停止开发,然而,Ardupilot/APM、Pixhawk/PX4、Papa…...
Pinia: vue3状态管理
一、Pinia 的相关介绍 1. 什么是 Pinia Pinia 是一个专门配合 vue.js 使用的状态管理, 从而实现跨组建通信或实现多个组件共享数据的一种技术 2. 使用 Pinia 的目的 我们的vuejs有俩个特性: 1> 数据驱动视图. 2> 组件化开发 基于这俩个特性, 我们引出pinia的使用目的 …...
初学Vue之记事本案例
初学Vue之记事本案例 案例功能需求相关Vue知识案例实现1.实现方法及代码2.演示 案例收获与总结 案例功能需求 基于Vue实现记事功能(不通过原生JS实现) 1.点击保存按钮将文本框的内容显示在特定位置,且清空文本框内容 2.点击清空按钮&#x…...
中国发布Web3计划:区块链列为核心基础技术,不排除发展加密资产应用!
在全球数字化浪潮汹涌、Web3概念方兴未艾之际,中国政府再次展现了其在区块链技术领域的雄心与布局。近日,北京市多个核心政府部门联合发布了一项名为《北京市区块链创新应用发展行动计划(2025–2027年)》的重要政策文件࿰…...
并发设计模式实战系列(11):两阶段终止(Two-Phase Termination)
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第十一章两阶段终止(Two-Phase Termination),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 两阶段终止流…...
科学养生,解锁健康生活密码
健康是生命的基石,养生并非高深的学问,而是通过科学的生活方式,为身体构筑持久的健康防线。在现代快节奏生活中,掌握正确的养生方法,能有效提升生活质量,预防疾病侵袭。 均衡饮食是养生的核心。日常饮食应遵…...
计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践
概述 设想一下,你在多地拥有多个仓库,要同时监控每个仓库的实时状况,这对于时间和精力而言,都构成了一项艰巨挑战。从成本和可靠性的层面考量,大规模部署计算设备也并非可行之策。一方面,大量计算设备的购…...
初识 Java
文章目录 一、背景知识二、技术体系 一、背景知识 Java 是美国 sun(Stanford University Network)公司(2009 年被 Oracle 公司收购)在 1995 年推出的一门计算机高级编程语言 二、技术体系 Java SE(Java Standard Edition):标准版,Java 技术的核心和基…...
彩带飘落效果
文章目录 彩带效果适应场景HTML版本Vue3版本 彩带效果 彩带特效组件 适应场景 完成小结、版本升级等场景。提供HTM、Vue3版本。 HTML版本 <!doctype html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"…...
统计模式识别理论与方法
我们在前文《模式识别的基本概念与理论体系》中就已经提及“模式分类”。 具体内容看我的CSDN文章:模式识别的基本概念与理论体系-CSDN博客 模式的识别方法主要有统计模式识别方法和结构模式识别方法两大类。统计模式识别方法提出得较早,理论也较成熟…...
Ubuntu 安装 Cursor
Cursor 目前只有 Windows 和 Mac 版本,那么如何在 Ubuntu 上运行呢? 本质上是一个如何在 Ubuntu 运行 .appimage 的问题。 1. 下载 Cursor Linux 首先找到 Cursor 官网,下载 x64 安装包,如果你是 arm 架构,就下载 ar…...
前端八股 7
垃圾回收机制 系统周期性地找出暂时不再使用的变量的机制,释放其内存的机制 方法:古老引用计数法 创建一张引用表记录各种资源被引用的次数,当引用次数为0就回收 问题:当有两个对象互相引用时会造成内存泄漏 比如:…...
二、HTML
2.1 介绍 HTML(HyperText Markup Language,超文本标记语言) HTML是网页的骨架,用于定义网页的结构和内容。通过各种标签(如<div>、<p>、<a>、<img>等)来组织文本、图片、表格、表…...