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

安卓开发用到的设计模式(2)结构型模式

安卓开发用到的设计模式(2)结构型模式

文章目录

  • 安卓开发用到的设计模式(2)结构型模式
    • 1. 适配器模式(Adapter Pattern)
    • 2. 装饰器模式(Decorator Pattern)
    • 3. 代理模式(Proxy Pattern)
    • 4. 桥接模式(Bridge Pattern)
    • 5. 组合模式(Composite Pattern)
    • 6. 享元模式(Flyweight Pattern)
    • 7. 外观模式(Facade Pattern)

本文首发地址 https://h89.cn/archives/398.html

1. 适配器模式(Adapter Pattern)

适配器模式将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

在Android中的主要应用场景:

  1. RecyclerView和ListView的Adapter

    • 详细描述: 在Android开发中,Adapter 是连接数据源(如 List<String>Cursor)与 UI 组件(如 RecyclerViewListView)的关键桥梁。它负责将数据项转换为可以在屏幕上显示的 View 对象。通过实现 Adapter 接口,开发者可以自定义数据如何绑定到列表项的布局上,从而实现数据和 UI 的解耦。
    • 具体示例: 创建一个自定义的 RecyclerView.Adapter,在 onCreateViewHolder 中加载列表项布局,在 onBindViewHolder 中将数据绑定到布局中的各个 View 上。
  2. 网络请求适配

    • 详细描述: 在处理来自不同来源(如 RESTful API、GraphQL 或其他服务)的网络响应时,数据格式可能不一致。适配器模式可以用来将这些不同格式的响应数据转换为应用程序内部统一的数据模型,方便后续处理和使用。这有助于隔离外部数据格式的变化对核心业务逻辑的影响。
    • 具体示例: 使用 Retrofit 这样的网络库时,可以通过定义不同的 ConverterFactory 来适配 JSON、XML 或其他格式的响应数据,将其自动转换为 Java/Kotlin 对象。或者手动编写适配器类,将特定格式的响应数据解析并映射到应用的数据模型中。

2. 装饰器模式(Decorator Pattern)

装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

在Android中的主要应用场景:

  1. Context的扩展

    • 详细描述: Android中的 ContextWrapper 类是装饰器模式的一个典型应用。它包装了一个 Context 对象,并提供了相同的方法接口,但允许在其基础上添加或修改行为。ActivityServiceApplication 类都继承自 ContextWrapper,通过这种方式,它们在提供基本的 Context 功能的同时,也扩展了各自特有的功能(如管理生命周期、启动组件等)。
    • 具体示例: 创建一个自定义的 ContextWrapper 子类,可以在调用原始 Context 方法之前或之后执行额外的逻辑,例如统一处理权限检查或资源加载。
  2. View的自定义装饰

    • 详细描述: 装饰器模式可以用于动态地为 Android 的 View 组件添加额外的视觉效果或行为,而无需修改 View 的原有类结构。这可以通过创建包装 View 的自定义 DrawableViewGroup 来实现,这些包装器在绘制或处理事件时,在调用原始 View 的方法前后添加自己的逻辑。
    • 具体示例: 创建一个自定义的 Drawable,它可以包装一个现有的 View 的背景 Drawable,并在其外部绘制边框或阴影。或者创建一个自定义的 ViewGroup,它包含一个子 View,并在子 View 的基础上添加点击波纹效果或拖拽功能。

3. 代理模式(Proxy Pattern)

代理模式为其他对象提供一种代理以控制对这个对象的访问。

在Android中的主要应用场景:

  1. 图片加载代理

    • 详细描述: 在 Android 应用中加载图片,尤其是来自网络或本地大图时,通常需要处理缓存、异步加载、缩放和内存管理等复杂问题。图片加载库(如 Glide、Picasso、Coil)内部就广泛使用了代理模式。它们提供一个简单的接口供开发者调用(代理),而实际的加载、缓存、解码等复杂操作则由背后的真实对象(被代理对象)完成。代理层可以控制对真实加载逻辑的访问,例如在加载前检查缓存,加载失败时显示占位图等。
    • 具体示例: 使用 Glide 加载图片时,我们通常写 Glide.with(context).load(imageUrl).into(imageView);。这里的 Glide 对象或其内部组件就充当了代理,它隐藏了图片加载的复杂性,并在内部管理线程池、内存缓存、磁盘缓存等。
  2. 权限检查代理

    • 详细描述: 在 Android 中,访问某些敏感操作(如调用系统服务、访问联系人、使用相机等)需要特定的权限。代理模式可以用于在执行这些操作之前插入权限检查的逻辑。这可以通过静态代理(手动创建代理类)或动态代理(在运行时生成代理类)来实现。动态代理常用于实现面向切面编程 (AOP),将权限检查、日志记录、性能监控等“横切关注点”从核心业务逻辑中分离出来。
    • 具体示例: 可以创建一个代理类,包装一个需要权限才能调用的方法。在调用代理方法时,先检查是否有所需权限,如果权限不足则提示用户或请求权限,只有权限满足时才调用被代理对象的实际方法。使用 AspectJ 或 Kotlin 的 AOP 框架,可以通过注解等方式,在方法执行前自动插入权限检查的逻辑,底层实现就依赖于动态代理。

4. 桥接模式(Bridge Pattern)

桥接模式将抽象部分与实现部分分离,使它们都可以独立地变化。

在Android中的主要应用场景:

  1. 主题切换

    • 详细描述: 桥接模式在 Android 主题切换中非常有用。它可以将界面的抽象表示(例如,一个按钮应该是什么颜色、字体大小等)与具体的实现(例如,日间主题的颜色值、夜间主题的颜色值)分离开来。这样,你可以独立地改变主题的实现(添加新的主题或修改现有主题的颜色、样式等),而无需修改使用这些主题的界面组件的代码。
    • 具体示例: 定义一个抽象的 Theme 接口,包含获取颜色、字体等方法。然后创建 DayThemeNightTheme 等实现类。界面组件(如 Button)持有 Theme 接口的引用,通过调用接口方法获取样式信息,而不是直接依赖具体的 DayThemeNightTheme 类。切换主题时,只需改变 Button 持有的 Theme 实例即可。
  2. 数据存储

    • 详细描述: 在 Android 应用中,数据可以存储在多种地方,如 SQLite 数据库、SharedPreferences、文件或网络存储。桥接模式可以将数据访问的抽象接口(如 UserDataRepository 接口,包含 getUser()saveUser() 等方法)与具体的存储实现(如 SQLiteUserRepositorySharedPreferencesUserRepository)分离开。这样,你可以根据需求轻松切换底层存储方式,而上层业务逻辑代码只需依赖抽象接口,无需关心具体的存储细节。
    • 具体示例: 定义一个 UserRepository 接口。实现 SQLiteUserRepositorySharedPreferencesUserRepository 类。在应用的数据层或业务逻辑层,通过依赖注入等方式获取 UserRepository 的实例。根据配置或用户选择,可以注入不同的实现类,从而在运行时切换数据存储方式。

5. 组合模式(Composite Pattern)

组合模式将对象组合成树形结构以表示"部分-整体"的层次结构。

在Android中的主要应用场景:

  1. View树结构

    • 详细描述: Android 的 UI 界面是典型的树形结构,其中 ViewGroup 作为复合对象(Composite),可以包含其他 ViewViewGroup(叶子或复合对象)。View 作为叶子对象,不能包含其他组件。组合模式使得开发者可以统一处理单个 View 对象和 ViewGroup 组合对象,例如对整个 View 树进行遍历、测量、布局和绘制操作,而无需区分是单个 View 还是 View 组。
    • 具体示例: 在布局文件中,我们可以嵌套使用 LinearLayoutRelativeLayoutViewGroup 来组织 TextViewButtonView。例如,一个 LinearLayout 可以包含多个 TextView 和一个嵌套的 AnotherViewGroup,这种层级关系就是组合模式的应用。对根 ViewGroup 调用 measure()layout() 方法,会递归地调用其所有子 View 的相应方法。
  2. 菜单结构

    • 详细描述: Android 的菜单系统(如选项菜单 Options Menu、上下文菜单 Context Menu)也常使用组合模式来构建层级结构。Menu 对象可以包含 MenuItem(叶子)和 SubMenu(复合对象)。SubMenu 自身也是一个 Menu,可以包含更多的 MenuItemSubMenu,从而形成多级菜单。这使得开发者可以一致地处理单个菜单项和包含子菜单的菜单项。
    • 具体示例: 在定义菜单资源文件时,可以使用 <menu> 标签作为根,包含 <item> 标签表示单个菜单项,以及嵌套的 <menu> 标签表示子菜单。例如:
      <menu><item android:id="@+id/action_settings" android:title="Settings"/><item android:id="@+id/action_share" android:title="Share"><menu><item android:id="@+id/action_share_email" android:title="Email"/><item android:id="@+id/action_share_social" android:title="Social Media"/></menu></item>
      </menu>
      
      这里的 <menu><item> 结构就体现了组合模式。

6. 享元模式(Flyweight Pattern)

享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。

在Android中的主要应用场景:

  1. Message对象池

    • 详细描述: 在 Android 的 Handler 消息机制中,为了避免在高频率发送消息时频繁创建和销毁 Message 对象导致的性能开销,系统内部使用了享元模式。Message 对象被放入一个对象池中进行复用。当需要发送消息时,优先从池中获取可用的 Message 对象,使用完毕后,通过 Message.recycle() 方法将其回收到池中,而不是直接销毁。这样大大减少了对象的创建数量,降低了内存压力。
    • 具体示例: 在使用 Handler 发送消息时,通常会通过 Message.obtain() 方法从消息池中获取一个 Message 对象,而不是直接 new Message()。例如:Message msg = Message.obtain(handler, what, obj); handler.sendMessage(msg);
  2. 线程池

    • 详细描述: 线程的创建和销毁是比较耗费资源的。享元模式的思想也体现在线程池的应用中。线程池维护一组可重用的线程,当有任务到来时,优先使用池中空闲的线程来执行任务,而不是为每个任务都创建新线程。任务执行完毕后,线程不会被销毁,而是返回到池中等待下一个任务。这减少了线程创建和销毁的开销,提高了系统的响应速度和吞吐量。
    • 具体示例: Android 中的 AsyncTask 内部就使用了线程池来管理后台任务的执行。虽然 AsyncTask 在 Android 11 中已被废弃,但其底层实现展示了线程池的应用。开发者也可以使用 java.util.concurrent 包中的 ThreadPoolExecutor 等类来创建自定义线程池,实现线程的复用。

7. 外观模式(Facade Pattern)

外观模式为子系统中的一组接口提供一个一致的界面,这个界面使得子系统更加容易使用。

在Android中的主要应用场景:

  1. 网络请求封装

    • 详细描述: 在 Android 应用中进行网络请求通常涉及构建请求、处理连接、解析响应、错误处理等一系列复杂步骤。外观模式可以创建一个简单的接口(外观),隐藏底层网络库(如 OkHttp, Retrofit)的复杂性。开发者只需调用外观提供的少量方法,即可完成网络请求,而无需直接与复杂的底层 API 交互。这简化了网络请求的使用,并使得替换底层网络库变得更容易。
    • 具体示例: 创建一个 ApiManager 类,其中包含 getUser(userId, callback)postData(data, callback) 等方法。在这些方法内部,使用 Retrofit 或 OkHttp 执行实际的网络请求,处理响应和错误,然后通过回调接口将结果返回给调用者。调用者只需与 ApiManager 交互,无需了解 Retrofit 或 OkHttp 的具体用法。
  2. 数据库操作

    • 详细描述: Android 的 SQLite 数据库操作(如打开数据库、创建表、执行 SQL 语句、管理 Cursor)相对底层和繁琐。外观模式可以提供一个更高级、更简单的接口来执行常见的数据库操作(CRUD:Create, Read, Update, Delete)。例如,可以创建一个 DatabaseHelperRepository 类作为外观,封装底层的 SQLiteOpenHelper 或 Room 库的细节,提供如 getAllUsers()addUser(user) 等方法。
    • 具体示例: 使用 Android Architecture Components 中的 Room 持久性库时,@Dao 接口就充当了外观的角色。开发者只需定义接口方法并使用注解,Room 会自动生成底层实现代码,封装了 SQLite 的复杂性。调用者只需调用 DAO 接口的方法即可进行数据库操作。
  3. 媒体播放

    • 详细描述: 使用 Android 原生的 MediaPlayerExoPlayer 进行媒体播放涉及状态管理(准备、播放、暂停、停止)、错误处理、音频焦点管理等多个方面。外观模式可以创建一个简单的播放器控制接口,隐藏这些复杂的状态转换和细节。这个外观对象负责协调底层播放器的各种操作,提供如 play(url)pause()stop() 等简单方法。
    • 具体示例: 创建一个 MusicPlayerFacade 类,内部持有 MediaPlayerExoPlayer 实例。MusicPlayerFacade 提供 play(String audioUrl)pause()resume()stop() 等方法。在 play() 方法中,处理 MediaPlayersetDataSourceprepareAsyncstart 等调用和状态监听。调用者只需调用 MusicPlayerFacade 的方法,无需直接操作 MediaPlayer 的复杂状态机。

这些结构型设计模式在Android开发中的应用不仅能够提高代码的复用性和可维护性,还能使代码结构更加清晰。通过合理使用这些模式,我们可以更好地组织代码,提高开发效率,并且使应用程序更容易维护和扩展。在实际开发中,我们应该根据具体场景选择合适的设计模式,避免过度设计,确保代码的简洁性和可读性。


相关系列文章:

  • 安卓开发用到的设计模式(1)创建型模式
  • 安卓开发用到的设计模式(2)结构型模式
  • 安卓开发用到的设计模式(3)行为型模式

相关文章:

安卓开发用到的设计模式(2)结构型模式

安卓开发用到的设计模式&#xff08;2&#xff09;结构型模式 文章目录 安卓开发用到的设计模式&#xff08;2&#xff09;结构型模式1. 适配器模式&#xff08;Adapter Pattern&#xff09;2. 装饰器模式&#xff08;Decorator Pattern&#xff09;3. 代理模式&#xff08;Pro…...

JavaWeb:SpringBoot配置优先级详解

3种配置 打包插件 命令行 优先级 SpringBoot的配置优先级决定了不同配置源之间的覆盖关系&#xff0c;遵循高优先级配置覆盖低优先级的原则。以下是详细的优先级排序及配置方法说明&#xff1a; 一、配置优先级从高到低排序 1.命令行参数 优先级最高&#xff0c;通过keyvalu…...

故障率预测:基于LSTM的GPU集群硬件健康监测系统(附Prometheus监控模板)

一、GPU集群健康监测的挑战与价值 在大规模深度学习训练场景下&#xff0c;GPU集群的硬件故障率显著高于传统计算设备。根据2023年MLCommons统计&#xff0c;配备8卡A100的服务器平均故障间隔时间&#xff08;MTBF&#xff09;仅为1426小时&#xff0c;其中显存故障占比达38%&…...

【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter3 项目实践 -1 项目功能描述

1 项目功能描述 # 智慧社区-小程序-1 欢迎页-加载后端&#xff1a;动态变化-2 首页-轮播图&#xff1a;动态-公共栏&#xff1a;动态-信息采集&#xff0c;社区活动&#xff0c;人脸检测&#xff0c;语音识别&#xff0c;心率检测&#xff0c;积分商城-3 信息采集页面-采集人数…...

FFmpeg 安装包全攻略:gpl、lgpl、shared、master 区别详解

这些 FFmpeg 安装包有很多版本和变种&#xff0c;主要区别在于以下几个方面&#xff1a; ✅ 一、从名称中看出的关键参数&#xff1a; 1. 版本号 master&#xff1a;开发版&#xff0c;最新功能&#xff0c;但可能不稳定。n6.1 / n7.1&#xff1a;正式版本&#xff0c;更稳定…...

AI浪潮下,媒体内容运营的五重变奏

算法驱动的个性化推荐 在信息爆炸的时代,用户面临着海量的内容选择,如何让用户快速找到感兴趣的人工智能内容,成为媒体运营的关键。算法驱动的个性化推荐模式应运而生,它通过分析用户的行为数据,如浏览历史、点赞、评论、搜索关键词等,构建用户兴趣画像 ,再依据画像为用…...

WindTerm 以 SSH 协议的方式通过安恒明御堡垒机间接访问服务器

1. 配置堡垒机秘钥 创建公私钥ssh-keygen -t rsa -b 4096执行完该命令后按照提示一路回车就能够创建出公私钥注意&#xff1a;在创建过程中会让你指定秘钥的存储位置以及对应的密码&#xff0c;最好自行指定一下 id_rsa 是私钥id_rsa.pub 是公钥 在堡垒机中指定创建好的私钥 …...

通过现代数学语言重构《道德经》核心概念体系,形成一个兼具形式化与启发性的理论框架

以下是对《道德经》的数学转述尝试&#xff0c;通过现代数学语言重构其核心概念&#xff0c;形成一个兼具形式化与启发性的理论框架&#xff1a; 0. 基础公理体系 定义&#xff1a; 《道德经》是一个动态宇宙模型 U(D,V,Φ)&#xff0c;其中&#xff1a; D 为“道”的无限维…...

邂逅Node.js

首先先要来学习一下nodejs的基础&#xff08;和后端开发有联系的&#xff09; 再然后的学习路线是学习npm&#xff0c;yarn&#xff0c;cnpm&#xff0c;npx&#xff0c;pnpm等包管理工具 然后进行模块化的使用&#xff0c;再去学习webpack和git&#xff08;版本控制工具&…...

计算机视觉(图像算法工程师)学习路线

计算机视觉学习路线 Python基础 常量与变量 列表、元组、字典、集合 运算符 循环 条件控制语句 函数 面向对象与类 包与模块Numpy Pandas Matplotlib numpy机器学习 回归问题 线性回归 Lasso回归 Ridge回归 多项式回归 决策树回归 AdaBoost GBDT 随机森林回归 分类问题 逻辑…...

GITLIbCICD流水线搭建

1&#xff0c;搭建gitLIb服务器&#xff0c;创建gitlibRunner 并且注册&#xff0c; 2. 写dockerfile 包块java程序运行的环境&#xff0c;jdk&#xff0c;参数等 &#xff0c; 2.1ai生成版本&#xff0c; # 基础镜像&#xff08;JDK 17&#xff09;FROM eclipse-temurin:1…...

详细介绍Qwen3技术报告中提到的模型架构技术

详细介绍Qwen3技术报告中提到的一些主流模型架构技术&#xff0c;并为核心流程配上相关的LaTeX公式。 这些技术都是当前大型语言模型&#xff08;LLM&#xff09;领域为了提升模型性能、训练效率、推理速度或稳定性而采用的关键组件。 1. Grouped Query Attention (GQA) - 分组…...

【慧游鲁博】【8】前后端用户信息管理:用户基本信息在小程序端的持久化与随时获取

文章目录 本次更新整体流程概述1. 用户登录流程前端登录处理 (login.vue)后端登录处理 (AuthServiceImpl.java) 2. 用户信息存储机制前端状态管理 (member.js) 3. 后续请求的身份验证登录拦截器 (LoginInterceptor.java)前端请求携带token 4. 获取用户信息获取用户信息接口 (Us…...

上位机知识篇---keil IDE操作

文章目录 前言文件操作按键新建打开保存保存所有编辑操作按键撤销恢复复制粘贴剪切全选查找书签操作按键添加书签跳转到上一个书签跳转到下一个书签清空所有书签编译操作按键编译当前文件构建目标文件重新构建调试操作按键进入调试模式复位全速运行停止运行单步调试逐行调试跳出…...

Odoo: Owl Hooks 深度解析技术指南

你好&#xff01;作为一名 Odoo 开发者&#xff0c;深入理解其前端框架 Owl.js&#xff0c;尤其是 Hooks&#xff0c;是提升开发效率和代码质量的关键。这份指南将带你从基础概念到高级应用&#xff0c;全面掌握 Odoo 18 中 Owl Hooks 的所有知识点。 1. Hooks 核心概念介绍 什…...

SpringBoot返回xml

默认情况下引入web依赖后自带了JackJson 返回JSON数据 你也可以引入fastJSON 那么方便使用可以用JSON.xxx 如果希望Boot默认返回xml数据 <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml<…...

【案例篇】 实现简单SSM工程-后端

简介 本篇文章将带你从0到1的实现一个SSM项目&#xff0c;通过此案例可以让你在项目中对SpringBoot的使用有一个更加详细的认识&#xff0c;希望这个简单的案例能够帮到你。文章内容若存在错误或需改进的地方&#xff0c;欢迎大家指正&#xff01;若对操作有任何疑问欢迎留言&a…...

零基础学习计算机网络编程----网络基本知识

目录 1. 计算机网络发展 1.1 网络发展 1.2 媒介 2 认识协议 2.1 为什么要有协议 2.2 协议的本质 3 网络协议的初识 3.1 什么是协议分层 3.2 为什么会有 4. OSI七层模型 4.1 定义 5. TCP/IP五层(或四层)模型 5.1 有什么 6. 网络传输基本流程 6.1 网络传输流程图…...

Zynq和Microblaze的区别和优势

Zynq芯片包含了一颗双核ARM Cortex-A9处理器&#xff0c;这是一颗“硬”处理器---它是芯片上专用 而且优化过的硅片原件。 MicroBlaze为“软”处理器&#xff0c;它是由可编程逻辑部分的单元组合而成的&#xff0c; 也就是说&#xff0c;一个 软处理器的实现和部署在FPGA的逻…...

FastAPI 支持文件下载

FastAPI 支持文件下载 FastAPI 支持文件上传 Python 获取文件类型 mimetype 文章目录 1. 服务端处理1.1. 下载小文件1.2. 下载大文件&#xff08;yield 支持预览的&#xff09;1.3. 下载大文件&#xff08;bytes&#xff09;1.4. 提供静态文件服务 2. 客户端处理2.1. 普通下载2…...

CNN卷积神经网络到底卷了啥?

参考视频&#xff1a;卷积神经网络&#xff08;CNN&#xff09;到底卷了啥&#xff1f;8分钟带你快速了解&#xff01; 我们知道&#xff1a; 图片是由像素点构成&#xff0c;即最终的成像效果是由背后像素的颜色数值所决定 在Excel中&#xff1a;有这样一个由数值0和1组成的66…...

vue中v-clock指令

基础 v-cloak 是 Vue 中的一个非常实用的指令&#xff0c;用于防止在 Vue 实例尚未挂载完成前&#xff0c;用户看到模板中的插值语法&#xff08;如 {{ message }}&#xff09;一闪而过。 ✅ 场景举例 你在页面还没加载完前&#xff0c;可能会看到这样一瞬间的内容&#xff…...

MIT 6.S081 2020Lab5 lazy page allocation 个人全流程

文章目录 零、写在前面一、Eliminate allocation from sbrk()1.1 说明1.2 实现 二、Lazy allocation2.1 说明2.2 实现 三、Lazytests and Usertests3.1 说明3.2 实现3.2.1 lazytests3.2.2 usertests 零、写在前面 可以阅读下4.6页面错误异常 像应用程序申请内存&#xff0c;内…...

C++初阶-list的使用2

目录 1.std::list::splice的使用 2.std::list::remove和std::list::remove_if的使用 2.1remove_if函数的简单介绍 基本用法 函数原型 使用函数对象作为谓词 使用普通函数作为谓词 注意事项 复杂对象示例 2.2remove与remove_if的简单使用 3.std::list::unique的使用 …...

PHP序列化数据格式详解

PHP序列化数据格式详解 概述 PHP序列化是将PHP变量&#xff08;包括对象&#xff09;转换为可存储或传输的字符串表示形式的过程。了解这些序列化格式对于数据处理、调试和安全性分析非常重要。本文将详细介绍PHP中各种数据类型的序列化表示方式。 基本数据类型序列化格式 …...

如何优化 MySQL 存储过程的性能?

文章目录 1. 优化 SQL 语句避免全表扫描减少子查询&#xff0c;改用 JOIN避免 SELECT 2. 合理使用索引3. 优化存储过程结构减少循环和临时变量避免重复计算 4. 使用临时表和缓存5. 优化事务处理6. 分析和监控性能7. 优化数据库配置8. 避免用户自定义函数&#xff08;UDF&#…...

深度学习:损失函数与激活函数全解析

目录 深度学习中常见的损失函数和激活函数详解引言一、损失函数详解1.1 损失函数的作用与分类1.2 回归任务损失函数1.2.1 均方误差&#xff08;MSE&#xff09;1.2.2 平均绝对误差&#xff08;MAE&#xff09; 1.3 分类任务损失函数1.3.1 交叉熵损失&#xff08;Cross-Entropy&…...

【大前端】Node Js下载文件

NodeJs 获取远程文件有很多方式&#xff0c;常见的方式有以下两种&#xff1a; - fetch&#xff08;原生&#xff09; - axios&#xff08;插件&#xff09; 通过 Fetch 下载文件&#xff0c;代码如下&#xff1a; import fs from node:fsfunction main(){fetch(http://xxx.x…...

自训练NL-SQL模型

使用T5小模型在笔记本上训练 nature language to SQL/自然语言 转SQL 实测通过。 本文介绍了如何在笔记本上使用T5小模型训练自然语言转SQL的任务。主要内容包括:1) 创建Python 3.9环境并安装必要的依赖包;2) 通过Hugging Face镜像下载wikisql数据集和T5-small模型;3) 实现…...

创新点!贝叶斯优化、CNN与LSTM结合,实现更准预测、更快效率、更高性能!

能源与环境领域的时空数据预测面临特征解析与参数调优双重挑战。CNN-LSTM成为突破口&#xff1a;CNN提取空间特征&#xff0c;LSTM捕捉时序依赖&#xff0c;实现时空数据的深度建模。但混合模型超参数&#xff08;如卷积核数、LSTM层数&#xff09;调优复杂&#xff0c;传统方法…...