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

20.迭代器模式:思考与解读

原文地址:迭代器模式:思考与解读  更多内容请关注:深入思考与解读设计模式

引言

在软件开发中,尤其是在处理集合数据时,你是否曾经遇到过这样的问题:你需要遍历一个集合(如数组、列表、集合等),并对每个元素执行操作?你是如何设计遍历机制的?是不是每次都要写循环,手动管理索引或者指针?当你需要对不同的数据结构进行遍历时,是否会写很多不同的遍历逻辑?

如果我们能够通过一种方式,提供统一的遍历接口,使得在不改变集合的情况下,轻松地对集合进行遍历,这样的设计是否能够提高代码的复用性和可扩展性?

迭代器模式正是为了解决这个问题而设计的。它提供了一种统一的方式来遍历不同的数据结构,且不需要暴露集合的内部实现。你是否理解,为什么通过迭代器来封装遍历逻辑,能够让代码变得更加灵活,易于扩展?

在本文中,我们将通过一系列问题,逐步引导你理解迭代器模式的核心思想、应用场景以及如何实现它。

什么是迭代器模式?

问题1:当你需要遍历一个集合时,通常如何处理?你是通过集合提供的接口遍历,还是需要自己写遍历的逻辑?

假设你有一个列表,里面存储了一些元素。你是通过遍历列表的方式来访问每个元素吗?每次遍历时,你是直接访问列表的元素,还是通过某种统一的方式来处理这些元素?

问题2:如果你可以为不同类型的集合(如数组、链表、哈希表等)提供统一的遍历方式,而不需要关心它们的具体实现,你是否觉得系统会更加灵活且易于扩展?

迭代器模式通过为不同集合类型提供统一的遍历接口,让你可以在不关心集合具体实现的情况下对集合进行操作。你是否理解,这种统一接口如何让你的代码更加简洁、灵活?

迭代器模式的核心概念

问题3:迭代器模式通常包含哪些角色?每个角色的职责是什么?

迭代器模式通常包含以下几个核心角色:

  1. 迭代器(Iterator):定义了遍历集合的接口,通常包含next()has_next()等方法。

  2. 具体迭代器(ConcreteIterator):实现迭代器接口,具体负责遍历集合并返回元素。

  3. 聚合类(Aggregate):定义创建迭代器的方法,提供访问元素的接口。

  4. 具体聚合类(ConcreteAggregate):实现聚合类接口,存储集合元素,并创建具体迭代器对象。

你能理解这些角色如何协同工作,使得集合的遍历变得更加灵活和可扩展吗?

问题4:为什么要将集合的遍历与集合的实现解耦?这种设计如何提高代码的可扩展性?

在传统设计中,遍历集合的逻辑可能与集合的实现紧密耦合。通过引入迭代器模式,你可以将遍历逻辑从集合本身中分离出来。你是否理解,这样的设计如何让你能够在不修改集合类的情况下,轻松地添加新的遍历方式?

问题5:迭代器模式如何使得不同数据结构的遍历变得统一?你是否理解,为什么你可以用相同的方式遍历不同类型的集合(如数组、链表等)?

迭代器模式通过统一的接口,允许你在不同类型的集合上使用相同的遍历方法。你是否理解,这种方式如何简化了遍历操作,并让代码更具可复用性?

迭代器模式的实现

让我们通过一个简单的例子来说明迭代器模式的实现。假设我们有一个集合(如List),并希望为其提供统一的遍历接口。

步骤1:定义迭代器接口

from abc import ABC, abstractmethodclass Iterator(ABC):@abstractmethoddef next(self):pass@abstractmethoddef has_next(self) -> bool:pass

问题6:为什么我们需要定义一个迭代器接口(Iterator)?它提供了哪些方法,如何帮助我们实现统一的遍历操作?

Iterator接口定义了next()has_next()方法,这两个方法用于控制遍历集合的行为。你是否理解,为什么通过一个统一的接口来定义遍历行为,使得遍历操作不再依赖于具体的集合实现?

步骤2:定义具体迭代器类
class ListIterator(Iterator):def __init__(self, collection):self.collection = collectionself.index = 0def next(self):if self.has_next():item = self.collection[self.index]self.index += 1return itemreturn Nonedef has_next(self) -> bool:return self.index < len(self.collection)

问题7:ListIterator是如何实现Iterator接口的?它如何跟踪集合的位置,并返回下一个元素?

ListIterator类实现了Iterator接口,并通过next()方法返回当前元素,通过has_next()判断是否有下一个元素。你是否理解,为什么通过这种方式,ListIterator能够灵活地遍历集合而不依赖于集合的具体实现?

步骤3:定义聚合类接口
class Aggregate(ABC):@abstractmethoddef create_iterator(self) -> Iterator:pass

问题8:为什么我们需要定义一个聚合类接口(Aggregate)?它的作用是什么?

Aggregate接口定义了创建迭代器的方法。你是否理解,为什么聚合类需要提供一个创建迭代器的接口,而不直接暴露遍历集合的具体实现?

步骤4:定义具体聚合类
class ListAggregate(Aggregate):def __init__(self, collection):self.collection = collectiondef create_iterator(self) -> Iterator:return ListIterator(self.collection)

问题9:ListAggregate是如何实现Aggregate接口的?它如何提供迭代器来遍历集合?

ListAggregate实现了Aggregate接口,并通过create_iterator()方法返回一个ListIterator实例。你是否理解,为什么将集合的创建和迭代操作解耦,可以让我们更加灵活地使用不同类型的迭代器?

步骤5:客户端代码
def main():collection = [1, 2, 3, 4, 5]aggregate = ListAggregate(collection)iterator = aggregate.create_iterator()while iterator.has_next():item = iterator.next()print(item)if __name__ == "__main__":main()

问题10:在客户端代码中,如何通过迭代器来遍历集合?为什么迭代器使得遍历操作变得更加灵活?

客户端通过create_iterator()方法获取迭代器,并通过has_next()next()方法来遍历集合。你是否理解,为什么通过统一的迭代器接口,可以让我们轻松地在不同的数据结构上实现相同的遍历操作?

迭代器模式的优缺点

问题11:迭代器模式的优点是什么?它如何帮助我们实现集合遍历的解耦?

迭代器模式通过将集合的遍历逻辑封装在迭代器中,使得集合的实现和遍历逻辑相互独立。你是否理解,这种解耦如何提高了代码的灵活性,使得我们能够更轻松地修改集合的实现或增加新的遍历方式?

问题12:迭代器模式的缺点是什么?它是否可能导致类的数量增加,增加系统的复杂性?

虽然迭代器模式带来了更灵活的遍历方式,但它也可能导致系统中出现额外的类。你是否认为,过多的类会增加系统的复杂性?在一些简单的场景中,是否可以不使用迭代器模式,直接使用循环来遍历集合?

适用场景

问题13:迭代器模式适用于哪些场景?

迭代器模式特别适用于以下场景:

  • 当你需要遍历一个复杂的数据结构(如列表、树、图等),且希望遍历方式统一时。

  • 当你希望将遍历逻辑从集合的实现中解耦时。

  • 当需要提供多种遍历方式时,例如,正向遍历、逆向遍历等。

你能想到其他适用场景吗?例如,数据库查询结果的遍历、文件系统的遍历等,是否也可以使用迭代器模式?

问题14:迭代器模式是否适用于所有场景?在某些情况下,是否有更合适的设计模式来替代迭代器模式?

如果遍历操作非常简单,且集合不太复杂,是否有可能通过传统的for循环来替代迭代器模式?你是否认为,在某些场景下,简单的遍历方式可能比使用迭代器模式更合适?

接下来,我们将通过具体的代码示例来加深理解迭代器模式。

迭代器模式深入解读

一、引言

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种方法,允许你顺序访问一个集合(如列表、数组等)中的元素,而不暴露集合内部的实现细节。迭代器模式使得集合的遍历过程变得更加统一、简洁,同时增强了代码的灵活性和可维护性。


二、简单理解:什么是迭代器模式?

1. 什么是迭代器模式?

迭代器模式的核心思想是:通过提供一个迭代器对象来遍历集合中的元素,用户无需关心集合的具体实现方式。迭代器模式通常将集合的遍历过程与集合本身的实现解耦,使得你可以方便地对集合进行遍历、获取元素等操作,而无需关注集合的底层实现。

通俗地讲,迭代器模式就像你在翻阅一本书。你只关心书中的内容(元素),而不需要知道书是如何排版、装订的。你只需要通过翻页(迭代)来依次查看书中的每一页。

2. 迭代器模式的组成部分

迭代器模式通常包含以下几个部分:

  • 迭代器接口(Iterator):定义了访问集合元素的接口,包括 next()has_next() 等方法。

  • 具体迭代器(ConcreteIterator):实现了迭代器接口,定义了如何遍历集合。

  • 集合接口(Aggregate):定义了创建迭代器的方法。

  • 具体集合类(ConcreteAggregate):实现了集合接口,负责存储集合中的元素,并返回一个迭代器。


三、用自己的话解释:如何理解迭代器模式?

1. 类比实际生活中的场景

假设你正在浏览一个购物网站,网站上有很多商品,你想要查看所有商品的列表。在这个场景中,你是消费者,而网站是一个集合。你通过点击“下一页”按钮(迭代)来查看商品,而不需要关心商品是如何存储的或如何加载的。你只关心商品的展示,迭代器(浏览按钮)帮助你逐个查看商品,而不用直接与商品的存储方式打交道。

在编程中,迭代器模式允许我们访问集合中的元素,而不需要了解集合的实现方式。通过迭代器对象,我们可以按照一定的顺序获取集合中的每个元素。

2. 为什么要使用迭代器模式?

迭代器模式的好处是,它将集合的遍历过程与集合本身的实现解耦。这样,无论集合的存储方式如何变化(如数组、链表、哈希表等),我们都可以使用统一的方式来遍历集合元素。此外,迭代器模式提供了更高的灵活性,允许我们在不暴露集合内部细节的情况下进行遍历。


四、深入理解:迭代器模式的实现

接下来,我们通过一个具体的代码示例来实现迭代器模式,帮助你更好地理解如何在代码中使用这个模式。

示例:自定义集合类的迭代器

假设我们需要实现一个自定义的集合类,它可以存储多个整数,并且我们希望能够遍历集合中的每个元素。我们使用迭代器模式来实现这个功能。

1. 定义迭代器接口
# 迭代器接口:定义访问集合元素的基本方法
class Iterator:def has_next(self) -> bool:passdef next(self) -> int:pass
2. 定义集合接口
# 集合接口:定义创建迭代器的方法
class Aggregate:def create_iterator(self) -> Iterator:pass
3. 定义具体迭代器类
# 具体迭代器类:实现迭代器接口
class ConcreteIterator(Iterator):def __init__(self, collection: 'ConcreteAggregate'):self._collection = collectionself._index = 0def has_next(self) -> bool:return self._index < len(self._collection.items)def next(self) -> int:if self.has_next():item = self._collection.items[self._index]self._index += 1return itemreturn None  # 如果没有更多元素,返回 None
4. 定义具体集合类
# 具体集合类:实现集合接口
class ConcreteAggregate(Aggregate):def __init__(self):self.items = []def add(self, item: int):self.items.append(item)def create_iterator(self) -> Iterator:return ConcreteIterator(self)
5. 客户端代码:使用迭代器遍历集合
# 客户端代码:创建集合并使用迭代器遍历集合
aggregate = ConcreteAggregate()
aggregate.add(1)
aggregate.add(2)
aggregate.add(3)
aggregate.add(4)# 获取集合的迭代器
iterator = aggregate.create_iterator()# 使用迭代器遍历集合
while iterator.has_next():print(iterator.next())  # 输出:1 2 3 4
代码解析:
  1. Iterator 类:这是迭代器接口,定义了遍历集合元素的基本方法。has_next() 方法检查是否还有下一个元素,next() 方法返回当前元素并移动到下一个元素。

  2. Aggregate 类:这是集合接口,定义了创建迭代器的方法。任何具体的集合类都需要实现这个接口,提供创建迭代器的功能。

  3. ConcreteIterator 类:这是具体的迭代器类,实现了 Iterator 接口。它通过保存集合对象的引用和当前索引,能够按顺序访问集合中的元素。

  4. ConcreteAggregate 类:这是具体的集合类,它实现了 Aggregate 接口,提供了一个 create_iterator 方法,返回一个迭代器实例。集合类还提供了 add 方法来添加元素到集合中。

  5. 客户端代码:客户端通过 ConcreteAggregate 创建集合对象,使用 create_iterator 方法获取迭代器,然后通过迭代器遍历集合中的每个元素。


五、解释给别人:如何讲解迭代器模式?

1. 用简单的语言解释

迭代器模式就像是你在逐一查看一个书架上的书。你可以通过迭代器逐本查看书架上的每本书,而不需要知道书是如何排放在书架上的。你只需要知道如何通过迭代器获取下一本书,直到书架上没有书为止。迭代器模式让我们可以统一地访问集合中的元素,而不需要关注集合的具体存储方式。

2. 为什么要使用迭代器模式?

使用迭代器模式的好处是,它让我们能够以统一的方式遍历不同类型的集合。无论集合是存储在数组、链表还是其他数据结构中,迭代器都提供了相同的接口来访问集合元素。这不仅简化了代码,也使得集合的实现与遍历逻辑解耦,增加了代码的可维护性和扩展性。


六、总结

迭代器模式通过将集合的遍历逻辑封装在迭代器类中,使得不同的数据结构能够通过统一的接口进行遍历,从而简化了代码,提高了系统的灵活性和可扩展性。然而,迭代器模式也可能导致类的数量增加,增加系统的复杂性,因此在简单场景下,我们可以权衡是否使用迭代器模式。

通过以上过程,我们可以得出以下结论:

  • 迭代器模式 是一种行为型设计模式,它允许我们以统一的方式遍历集合中的元素,而不需要关心集合的内部结构。

  • 迭代器模式解耦了集合的实现与遍历逻辑,使得代码更加简洁和易于维护。

  • 迭代器模式适用于需要访问集合元素的场景,尤其是在不同类型集合之间需要统一遍历方式的情况下。

迭代器模式的优点:
  • 统一接口:提供了一个统一的接口来遍历不同的集合,简化了集合的访问。

  • 解耦:将集合的实现和遍历逻辑分离,使得代码更加灵活。

  • 易于扩展:可以轻松地添加新的集合类型,并通过迭代器统一访问。

迭代器模式的缺点:
  • 增加复杂性:对于简单的集合,使用迭代器可能显得过于复杂,增加了类的数量。

  • 性能问题:如果迭代器实现不当,可能会影响遍历集合的性能。

相关文章:

20.迭代器模式:思考与解读

原文地址:迭代器模式&#xff1a;思考与解读 更多内容请关注&#xff1a;深入思考与解读设计模式 引言 在软件开发中&#xff0c;尤其是在处理集合数据时&#xff0c;你是否曾经遇到过这样的问题&#xff1a;你需要遍历一个集合&#xff08;如数组、列表、集合等&#xff09…...

Java 学习笔记:注解、泛型与 IO 流

目录 课程目标 Java 注解(Annotation) 1. 概念与作用 2. 自定义注解示例 3. JDK 内置注解 4.注释 Java 泛型(Generics) 1. 基本语法 2. 通配符与上下限 3. 常见应用场景 Java IO 流 1. 流的分类1.File文件类 2. 字节流与字符流 3. 经典示例:文件拷贝 总结与…...

在 Excel 使用macro————仙盟创梦IDE

Dim filePath As StringDim fileContent As StringDim lines() As StringDim dataArray() As StringDim lineCount As LongDim maxCols As LongDim i As Long, j As Long 文件路径filePath "" 检查文件是否存在If Dir(filePath) "" ThenMsgBox "文件…...

【MySQL】08.视图

视图就是一个由查询到的内容定义的虚拟表。它和真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 1. 基本使用 mysql> select * from user; -------------------- | id | age | name …...

鸿蒙devEco studio如何创建模拟器

官网原文链接&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-emulator-create 操作步骤 点击菜单栏的Tools > Device Manager&#xff0c;点击右下角的Edit设置模拟器实例的存储路径Local Emulator Location&#xff0c;Mac默认存储在~/…...

鸿蒙路由参数传递

页面test.ets 代码如下&#xff1a; import router from ohos.router Entry Component struct Test {State message: string Hello WorldState username: string huState password: string 1build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWe…...

springboot 控制层调用业务逻辑层,注入报错,无法自动装配 解决办法

报错&#xff1a; 解决&#xff1a;愿意是业务逻辑层&#xff0c;即service层的具体实现类没有加注解Service导致的&#xff0c;加上解决了&#xff01;&#xff01;...

MySQL:11_事务

事务 一.CURD不加控制&#xff0c;会有什么问题&#xff1f; 二.什么是事务&#xff1f; 事务就是一组DML语句组成&#xff0c;这些语句在逻辑上存在相关性&#xff0c;这一组DML语句要么全部成功&#xff0c;要么全部失败&#xff0c;是一个整体。MySQL提供一种机制&#xf…...

Linux中的文件系统和软硬连接

磁盘的访问方式 CHS&#xff08;柱面&#xff0c;磁头&#xff0c;扇区&#xff09; 法&#xff08;磁盘硬件查找&#xff09;&#xff1a; 确定柱面&#xff08;C&#xff09; 磁头臂移动到对应的柱面位置。例如&#xff0c;柱面号为 5&#xff0c;则磁头移动到第 5 个磁道组…...

并发容器(Collections)

一、并发安全问题根源 1. List&#xff08;如ArrayList&#xff09; 问题表现&#xff1a;多线程同时调用add、remove等方法时&#xff0c;可能抛出ConcurrentModificationException或导致数据不一致。根本原因&#xff1a; 非原子性操作&#xff1a;如add操作的流程&#xf…...

SPA模式下的es6如何加快宿主页的显示速度

SPA的模式下&#xff0c;宿主页是首先加载的页面&#xff0c;会需要一些主要的组件&#xff0c;如element-plus&#xff0c;easyui&#xff0c;devextreme&#xff0c;ant-design等&#xff0c;这些组件及其依赖组件&#xff0c;文件多&#xff0c;代码量大&#xff0c;可能导致…...

windows powershell 判断 进程号是否存在

在 Windows PowerShell 中&#xff0c;你可以使用多种方法来检查一个特定的进程号&#xff08;PID&#xff09;是否存在。以下是几种常用的方法&#xff1a; 方法1&#xff1a;使用 Get-Process 命令 你可以尝试获取具有特定 PID 的进程。如果该进程存在&#xff0c;Get-Proce…...

c# 解码 encodeURIComponent

在C#中&#xff0c;如果你需要解码由encodeURIComponent方法编码的URL&#xff0c;你可以使用System.Web命名空间中的HttpUtility.UrlDecode方法。这个方法可以处理由JavaScript的encodeURIComponent方法编码的字符串。 首先&#xff0c;确保你的项目中引用了System.Web命名空…...

Spring AI:Java开发者的AI开发新利器

目录 一、引言 二、Spring AI 是什么 三、核心功能与特性 3.1 统一的 API 抽象 3.2 丰富的模型支持 3.3 低代码集成 3.4 结构化数据输出 3.5 流式数据响应 四、应用场景 4.1 智能客服系统 4.2 图像识别应用 4.3 数据分析与预测 五、快速上手 5.1 环境搭建 5.2 创…...

Android System UI 深度解析:从架构演进到车载 / TV 场景的全维度定制

Android System UI 是 Android 操作系统的核心组件,负责管理设备的系统级用户界面和交互逻辑。它通过状态栏、导航栏、通知面板、快速设置等功能,为用户提供与系统功能直接交互的入口,并与硬件、应用程序深度协同,构建完整的用户体验。以下是其核心架构、功能演进及定制化能…...

Spring Cloud Sleuth与Zipkin深度整合指南:微服务链路追踪实战

上篇文章简单介绍了SpringCloud系列熔断器&#xff1a;Sentinel的搭建及基本用法&#xff0c;今天继续讲解下SpringCloud的微服务链路追踪&#xff1a;Zipkin的使用&#xff01;在分享之前继续回顾下本次SpringCloud的专题要讲的内容&#xff1a; 前置知识说明 在开始本教程前…...

React从基础入门到高级实战:React 基础入门 - 列表渲染与条件渲染

列表渲染与条件渲染 在 React 开发中&#xff0c;列表渲染 和 条件渲染 是处理动态数据和用户交互的基础技术。通过列表渲染&#xff0c;你可以根据数据动态生成 UI 元素&#xff1b;而条件渲染则让你根据特定条件展示不同的内容。这两个技能在实际项目中非常常见&#xff0c;…...

在 stm32 中 volatile unsigned signed 分别有什么作用,分别在什么场景下使用?

在STM32开发中&#xff0c; plaintext 复制 volatile 、 plaintext 复制 unsigned 和 plaintext 复制 signed 是三个关键的关键字&#xff0c;它们的用途和场景如下&#xff1a; 1. plaintext 复制 volatile 关键字 作用&#xff1a; 禁止编译器优化&#xff…...

FreeBSD14.2因为爆内存而导致Xfce4视窗被卡,桌面变黑色,只能看到鼠标在窗体中心,鼠标无反应,键盘无反应

拿问题问AI pytest的时候因为内存不足导致xfce4卡住&#xff08;xfce4相关进程被关闭&#xff09;&#xff0c;桌面变黑色&#xff0c;只能看到鼠标在窗体中心&#xff0c;鼠标无反应&#xff0c;键盘无反应&#xff0c;请问应该怎么办&#xff1f; pytest的时候因为内存不足导…...

k8s-NetworkPolicy

在 Kubernetes 中&#xff0c;NetworkPolicy 是一种资源对象&#xff0c;用于定义 Pod 之间的网络通信策略。它允许你控制哪些 Pod 可以相互通信&#xff0c;以及如何通信。通过使用 NetworkPolicy&#xff0c;可以实现更细粒度的网络访问控制&#xff0c;增强集群的安全性。 1…...

spring-ai 集成 mcp 之投机取巧

主旨 这篇文章主旨就一点&#xff0c;罗列spring-ai对mcp集成导致出现的一系列问题 分析 由于mcp未问世之前&#xff0c;就早就已经有了工具调用&#xff0c;源码如下&#xff1a; public interface ToolCallback {/*** Definition used by the AI model to determine when a…...

大语言模型的完整训练周期从0到1的体系化拆解

以下部分内容参考了AI。 要真正理解大语言模型&#xff08;LLM&#xff09;的创生过程&#xff0c;我们需要将其拆解为一个完整的生命周期&#xff0c;每个阶段的关键技术相互关联&#xff0c;共同支撑最终模型的涌现能力。以下是体系化的训练流程框架&#xff1a; 阶段一&am…...

历年北京邮电大学保研上机真题

2025北京邮电大学保研上机真题 2024北京邮电大学保研上机真题 2023北京邮电大学保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/problem?classification1 32位二进制串加法 题目描述 输入一个32位的二进制01串&#xff0c;输出这个数1和3后的32位二进制串。 输入…...

elementUI 中el-date-picker和el-select的样式调整

1. el-date-picker <el-date-picker class"select1" size"small" v-model"timeRangeArr" type"daterange" align"right" unlink-panels range-separator"至" start-placeholder"开始日期" end-pla…...

《仿盒马》app开发技术分享-- 定位获取(端云一体)

开发准备 上一节我们实现了地址管理页面的数据查询和展示&#xff0c;接下来我们要实现的功能是地址添加相关的&#xff0c;我们想实现的功能是地图选点&#xff0c;那么在地图选点之前我们要做的就是先获取用户当前的定位。获取定位后我们拿到经纬度和其他信息&#xff0c;然…...

黑马点评--基于Redis实现共享session登录

集群的session共享问题分析 session共享问题&#xff1a;多台Tomcat无法共享session存储空间&#xff0c;当请求切换到不同Tomcat服务时&#xff0c;原来存储在一台Tomcat服务中的数据&#xff0c;在其他Tomcat中是看不到的&#xff0c;这就导致了导致数据丢失的问题。 虽然系…...

Mujoco 学习系列(二)基础功能与xml使用

这篇文章是 Mujoco 学习系列第二篇&#xff0c;主要介绍一些基础功能与 xmI 使用&#xff0c;重点在于如何编写与读懂 xml 文件。 运行这篇博客前请先确保正确安装 Mujoco 并通过了基本功能与GUI的验证&#xff0c;即至少完整下面这个博客的 第二章节 内容&#xff1a; Mujoc…...

比特授权云外壳加密支持Android 15!

在信息化时代&#xff0c;多数软件供应商需要适配安卓系统&#xff0c;以扩大市场、满足用户需求并提升竞争力。APK作为Android应用的安装包&#xff0c;包含代码、资源、配置文件等运行所需组件&#xff0c;用于在设备端分发和安装应用。企业在分发软件时&#xff0c;需要通过…...

uniapp使用sse连接后端,接收后端推过来的消息(app不支持!!)

小白终成大白 文章目录 小白终成大白前言一、什么是SSE呢&#xff1f;和websocket的异同点有什么&#xff1f;相同点不同点 二、直接上实现代码总结 前言 一般的请求就是前端发 后端回复 你一下我一下 如果需要有什么实时性的 后端可以主动告诉前端的技术 我首先会想到 webso…...

历年复旦大学保研上机真题

2025复旦大学保研上机真题 2024复旦大学保研上机真题 2023复旦大学保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/problem?classification1 最大公共子串 题目描述 输入 3 个子串&#xff0c;输出这 3 个子串的最大公共子串。 输入格式 输入包含 3 个子串&…...