深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨

在这里插入图片描述​🌈 个人主页:danci_
🔥 系列专栏:《设计模式》
💪🏻 制定明确可量化的目标,坚持默默的做事。
🚀 转载自:设计模式深度解析:深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨


深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱

开篇:
    欢迎来到设计模式的神秘世界,今天我们将一起走进两个让编程更加高效的秘密花园:游标尺模式与迭代器模式。🌟 这里不仅是代码的奥秘,而是让你的思维更加清晰,让你的程序更加优雅的关键所在。在这篇文章中,我们将一起拨开重重迷雾,深入这两种模式的精髓,解锁它们真正的魔力。准备好了吗?让我们一起揭开神秘面纱,深入浅出地探索,为什么这两种模式在软件设计中是不可或缺的宝藏!🔥🧩

文章目录

  • Part 1: 游标尺模式 — 比你想象的更有用!📏🌈
    • `定义`
    •  作用</code>
  • Part 2: 迭代器模式 — 走遍无难遍的秘密武器 🔍🚀
    •  定义
    • 作用</code>
  • Part 3: 从游标尺到迭代器 — 解锁编程的无限可能 🗝️🌟
    • 区别</code>
    • 关联与协同应用
      •   `关联:遍历与控制`
      •   `区别:精细控制与通用接口`
      •   `协同应用:灵活性与效率并重`
  • Part 4: 设计场景与问题示例 🤼
    •   `场景`
    •   `Java实现`
  • 🔥 结论与行动呼吁 💖

Part 1: 游标尺模式 — 比你想象的更有用!📏🌈

  
在这里插入图片描述

  

定义

 
    游标尺模式,顾名思义,它的灵感来源于我们日常生活中的游标尺。想象一下,当你需要精确测量一个物体的长度时,你会使用什么工具?一把简单的直尺可能无法满足你对精度的要求,这时候,游标尺就派上了用场。

    特点: 能够提供一个更精细的测量单位,通过主尺和游标的配合使用,可以读取到比单一刻度更精确的数值。同样地,在软件设计中,游标尺模式也提供了一种精确访问和处理数据元素的方式。

    在游标尺模式中,游标充当了数据访问的指针角色,它可以在数据集合中自由移动,并且能够精确地指向和访问集合中的每一个元素。与迭代器模式不同,游标尺模式更注重于对单个元素的精确控制和访问,而不是简单地遍历整个集合。

    简单来说,游标尺模式就像是一个专业的测量员,它不仅能够告诉你整个数据集合的长度(如果需要的话),还能够精确地定位到你感兴趣的每一个数据点,并且允许你对这些点进行细致的观察和操作。

    通过这种方式引入游标尺模式的概念,想必你应该可以清晰地看到它与迭代器模式之间的区别。迭代器模式更像是一个导游,带领你快速地浏览整个景点(数据集合),而游标尺模式则是一个专业的导游,不仅能够带你游览整个景点,还能够根据你的需求,精确地带你深入到景点的每一个细节中去
 

 作用

    首先,它提供了一种灵活的方式来遍历集合对象,可以根据需要控制遍历的方向、步长等参数,使得遍历过程更加可控和灵活。

    游标尺模式可以隐藏集合对象内部的复杂性,使得使用者无需了解集合的具体实现细节,只需通过游标对象进行操作即可。
    此外,游标尺模式还支持在遍历过程中进行元素的插入、删除等操作,提供了一种动态地修改集合内容的方式。
 

  详见:
探索设计模式的魅力:精准、快速、便捷:游标尺模式在软件设计中的三大优势文章浏览阅读3.2k次,点赞154次,收藏137次。游标尺模式是一种常用的软件设计模式,通过逐条处理数据集来优化性能和提升操作的便捷性。在处理大规模数据集时,该模式能够显著降低内存消耗,提高处理速度,并保证数据的精确控制。尽管游标尺模式在处理复杂逻辑时可能增加难度,且可能影响性能和增加维护成本,但其在精确处理数据方面的出色表现使其成为软件设计的有效解决方案。在具体应用中,我们应根据实际需求和场景特点来权衡其优缺点,以充分发挥其优势。总之,游标尺模式为需要精确处理数据的软件设计场景提供了有力支持。https://blog.csdn.net/danci_/article/details/136980023

 

Part 2: 迭代器模式 — 走遍无难遍的秘密武器 🔍🚀

  
在这里插入图片描述

  

 定义

 
    迭代器模式,我们可以将其想象成一个导游。当我们游览一座大型博物馆时,导游会负责带领我们参观,一一介绍各个展区的特色展品。这位导游就是迭代器,他知道如何遍历整个博物馆(数据集合),并且按顺序向我们展示每个展区的内容(数据元素)。

    与游标尺模式不同,迭代器模式更注重于提供一个标准化的访问接口,使得我们无需了解底层数据结构的具体实现细节。无论是参观一个拥有丰富展品的博物馆,还是一个陈列简洁的画廊,导游(迭代器)都能以相同的方式带领我们遍历。

    在编程中,迭代器模式也是如此。它提供了一个统一的接口来遍历不同的数据结构,比如数组、列表、集合等。通过迭代器,我们可以不关心数据是如何存储和组织的,只需要调用迭代器的next()方法来获取下一个元素,以及使用hasNext()方法来检查是否还有更多元素可供访问。

    通过这种方式,迭代器模式简化了数据遍历的操作,提高了代码的可读性和可维护性。它就像那位尽职的导游,无论面对何种类型的博物馆,都能带给我们流畅而愉快的参观体验。而与游标尺模式相比,迭代器模式更侧重于提供一个通用的遍历机制,而不是对单个元素的精细控制。
 

作用

    提供了一种统一的接口来遍历不同的聚合对象,使得代码更加简洁和可维护。使用者只需通过迭代器对象进行操作,而无需关心聚合对象的具体类型或实现细节。

    迭代器模式支持在遍历过程中进行元素的增删操作,可以方便地实现对聚合对象的动态修改。
 
    此外,迭代器模式还提供了一种延迟计算的方式,可以在遍历过程中按需加载元素,提高了程序的效率和性能。
 

  详见:
探索设计模式的魅力:迭代器模式让你轻松驾驭复杂数据集合文章浏览阅读2.5k次,点赞141次,收藏100次。迭代器模式是设计模式中的一种,旨在提供一种访问集合元素的方式,同时不暴露底层数据结构。其核心是抽离遍历集合的复杂性,实现一个统一的迭代接口,简化客户端与数据结构的交互。
该模式的目的是解决不同数据结构遍历的普遍需求,并应对直接暴露对象内部表示所带来的维护和扩展难题。迭代器模式通过封装遍历算法,减少冗余,提升代码抽象级别,对软件设计的清晰性和灵活性至关重要。
迭代器模式中的关键角色包括Iterator接口定义必要的遍历操作,ConcreteIterator实现具体的遍历逻辑,以及Aggregate接口表
https://blog.csdn.net/danci_/article/details/136175853

  

Part 3: 从游标尺到迭代器 — 解锁编程的无限可能 🗝️🌟

  
在这里插入图片描述
  

区别

在这里插入图片描述

    游标尺模式和迭代器模式在软件开发中各有其独特的作用和适用场景。游标尺模式强调对单个元素的精确访问和操作性能优化;而迭代器模式则注重提供统一的遍历接口和简化遍历操作。开发者应根据具体需求和场景选择合适的模式来使用。
  

关联与协同应用

  
    在软件设计中,游标尺模式和迭代器模式虽然各自有着独特的应用场景和优势,但它们之间也存在一定的关联,并且可以通过协同应用来提升软件设计的效率和质量。
  

  关联:遍历与控制

  
    游标尺模式和迭代器模式在核心功能上都涉及到了对集合元素的遍历。无论是游标尺还是迭代器,它们都提供了一种访问集合元素的方式,使得开发者能够按照特定的顺序或条件来逐个处理这些元素。这种遍历功能是两种模式之间的主要关联点。
  

  区别:精细控制与通用接口

  
    尽管游标尺模式和迭代器模式在遍历功能上有所关联,但它们在实现方式和应用场景上存在明显的区别。

    游标尺模式更注重对单个元素的精细控制。它允许开发者在遍历过程中进行复杂的操作,如定位特定元素、修改元素值或删除元素等。游标尺模式通常与特定的数据结构或数据库操作紧密相关,它提供了一种更加灵活和细粒度的访问机制。

    相比之下,迭代器模式则更注重提供一个统一的遍历接口。它抽象了底层数据结构的细节,使得开发者能够以一种标准化的方式来遍历不同的集合类型。迭代器模式强调的是遍历的通用性和简洁性,它使得代码更加清晰、易于理解和维护。
 

  协同应用:灵活性与效率并重

 
    在实际的软件设计中,我们可以根据具体的需求将游标尺模式和迭代器模式巧妙结合,以达到更优的解决方案。

    例如,在处理大型数据集或复杂数据结构时,我们可以使用游标尺模式来提供对元素的精细控制。通过游标尺,我们可以精确地定位和处理每个元素,满足特定的业务需求。同时,为了简化遍历操作和提高代码的可重用性,我们可以在游标尺的基础上实现一个迭代器接口。这样,开发者既可以利用游标尺的精细控制能力,又可以享受迭代器带来的简洁和统一的遍历体验。

    另外,在一些需要同时支持多种遍历方式的场景中,我们也可以将游标尺模式和迭代器模式结合使用。例如,一个数据库管理系统可能同时提供了基于游标尺的复杂查询功能和基于迭代器的简单遍历功能。这样,开发者可以根据不同的需求选择合适的遍历方式,灵活应对各种业务场景。
 

Part 4: 设计场景与问题示例 🤼

  
在这里插入图片描述
  

  场景

  
    考虑一个在线购物平台的订单处理系统。在这个系统中,我们需要处理大量的订单数据,包括查询、修改和删除等操作。为了提高性能和灵活性,我们可以采用游标尺模式和迭代器模式的结合应用。

    对于复杂的订单查询需求,我们可以使用游标尺模式来定位和处理特定的订单。通过游标尺,我们可以根据订单状态、下单时间等条件来筛选订单,并逐个处理符合条件的订单记录。这种精细控制的能力使得我们能够精确地满足复杂的业务需求。

    而对于简单的订单遍历需求,我们可以提供一个基于迭代器的接口。通过迭代器,开发者可以以一种统一和简洁的方式来遍历订单集合,无需关心底层数据结构的细节。这种遍历方式适用于一些常见的操作,如展示订单列表或统计订单数量等。

    通过结合使用游标尺模式和迭代器模式,我们既能够满足复杂查询的需求,又能够简化常见的遍历操作。这样的设计既提高了软件开发的效率,又保证了代码的质量和可维护性。
  

  Java实现

  
    以下是一个简化的示例,说明如何在订单处理系统中结合使用游标和迭代器模式。

  1. 首先,我们定义一个Order类来表示订单:
public class Order {  private String orderId;  private String customerName;  private double totalAmount;  // 构造函数、getter和setter方法省略  
}
  1. 然后,我们定义一个 OrderRepository 接口,用于访问订单数据:
import java.util.Iterator;  public interface OrderRepository {  Iterator<Order> getOrders(); // 获取订单迭代器  void addOrder(Order order); // 添加订单  void removeOrder(String orderId); // 删除订单  // 其他方法省略  
}
  1. 现在,我们来实现一个基于内存的简单 OrderRepository
import java.util.ArrayList;  
import java.util.Iterator;  
import java.util.List;  public class InMemoryOrderRepository implements OrderRepository {  private List<Order> orders = new ArrayList<>();  @Override  public Iterator<Order> getOrders() {  return orders.iterator(); // 返回订单列表的迭代器  }  @Override  public void addOrder(Order order) {  orders.add(order);  }  @Override  public void removeOrder(String orderId) {  orders.removeIf(order -> order.getOrderId().equals(orderId));  }  // 其他方法省略  
}

    在这个实现中,我们使用了 ArrayList 来存储订单数据,并且直接返回了它的 Iterator 对象来允许客户端遍历订单列表。这里巧妙使用了迭代器模式,因为客户端代码不需要知道底层是如何存储订单的,只需要通过迭代器接口来访问数据。

    然而,对于数据库中的订单数据,我们通常会使用JDBC或ORM框架来访问,并且可能会使用游标来遍历查询结果。
4. 假设我们使用JDBC,那么游标的使用可能类似于以下代码:

import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.SQLException;  public class DatabaseOrderRepository implements OrderRepository {  private Connection connection;  public DatabaseOrderRepository(Connection connection) {  this.connection = connection;  }  @Override  public Iterator<Order> getOrders() {  // 这里不能直接返回ResultSet作为Iterator,因为ResultSet不是Iterator类型。  // 但我们可以创建一个适配器类来实现Iterator接口,并包装ResultSet。  try {  PreparedStatement stmt = connection.prepareStatement("SELECT * FROM orders");  ResultSet rs = stmt.executeQuery();  return new ResultSetIterator(rs); // 假设我们有一个ResultSetIterator类来实现Iterator接口。  } catch (SQLException e) {  throw new RuntimeException("Failed to retrieve orders", e);  }  }  // 其他方法省略,包括关闭连接等。  // 假设的ResultSetIterator类,用于将ResultSet适配为Iterator接口。  private static class ResultSetIterator implements Iterator<Order> {  private ResultSet resultSet;  public ResultSetIterator(ResultSet resultSet) {  this.resultSet = resultSet;  }  @Override  public boolean hasNext() {  try {  return resultSet.next();  } catch (SQLException e) {  throw new RuntimeException("Failed to check next element", e);  }  }  @Override  public Order next() {  try {  // 假设我们有一个从ResultSet创建Order对象的方法。  return createOrderFromResultSet(resultSet);   } catch (SQLException e) {  throw new RuntimeException("Failed to retrieve next element", e);  }  }  // createOrderFromResultSet方法的实现省略。  // 这个方法会根据ResultSet中的数据创建一个Order对象。  // 其他Iterator方法(如remove)可以根据需要实现或抛出UnsupportedOperationException。  }  // 其他方法省略,包括addOrder和removeOrder的实现,这些可能需要执行相应的SQL语句。  
}

    在这个示例中,我们没有直接巧妙使用游标尺模式,因为JDBC的 ResultSet 本身就是游标的一个实现。我们通过 PreparedStatement 执行查询,得到 ResultSet 对象,然后使用自定义的 ResultSetIterator 类来将其适配为 Iterator 接口,以便客户端代码可以以统一的方式遍历订单数据,无论数据是存储在内存中还是数据库中。这种适配器模式的使用是巧妙的,因为它允许我们将两种不同的遍历机制(游标和迭代器)统一到一个接口下。

    注:上面的代码示例是为了说明概念而简化的,并没有处理异常关闭资源或实现所有必要的功能。在实际应用中,你需要确保正确处理异常、关闭数据库连接和结果集,以及实现其他必要的业务逻辑。
  

🔥 结论与行动呼吁 💖

  
在这里插入图片描述

  

    在编程的旅程中,我们不断追求着代码的优雅与高效。而游标尺模式和迭代器模式,正是我们手中的两把利剑,助我们披荆斩棘,攻克编程难题。它们的重要性不言而喻,无论是在处理集合数据,还是遍历数据库查询结果,都能发挥出巨大的作用。👍
       通过本文的对比分析,我们更加清晰地认识到这两种模式的独特魅力和各自的优势。迭代器模式以统一的接口访问元素,无需暴露底层结构,为集合数据的遍历提供了便捷之道;而游标尺模式则专注于数据库查询结果的逐行访问,为大数据处理提供了灵活的解决方案。🧐
  

    在此,我们衷心希望每一位读者都能将所学知识转化为实践动力,在实际编程中灵活运用这两种模式,不断提升代码的效率和可维护性。让你的代码如行云流水般流畅,既具备优雅之美,又拥有高效之能。🤔
  

    🔥现在,就让我们一起携手,深入探索这两大设计模式的奥秘吧!在编程的世界里,我们将共同书写出更加精彩的篇章,让你的代码之旅更加绚烂多彩!🚀🛤️
  

    👏 让我们一起迈向更加精彩的软件设计之路吧!在此助您在软件设计的海洋中乘风破浪。 🚢
  

🚀 转载自:设计模式深度解析:深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/778211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【测试开发学习历程】Python数据类型:字符串-str(上)

目录 1 Python中的引号 2 字符串的声明 3 字符串的切片 4 字符串的常用函数 4.1 len()函数 4.2 ord()函数 4.3 chr()函数 5 字符串的常用方法&#xff08;内置方法/内建方法&#xff09; 5.1 find()方法 5.2 index()方法 5.3 rfind()方法 5.4 rindex()方法 1 Python…

SAP-CO主数据之统计指标创建-<KK01>

公告&#xff1a;周一至周五每日一更&#xff0c;周六日存稿&#xff0c;请您点“关注”和“在看”&#xff0c;后续推送的时候不至于看不到每日更新内容&#xff0c;感谢。 目录 一、背景&#xff1a; 成本中心主数据创建&#xff1a;传送门 成本要素主数据创建&#xff1…

Linux内核之最核心数据结构之二:struct inode(三十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

图腾柱PFC:HP1010为您的电动两轮车之旅提供绿色,高效,安全的动力

电动两轮车不仅为当今生活提供了便利&#xff0c;更是一种健康和绿色的出行方式。想象一下&#xff0c;在经过一整晚的充分休息&#xff0c;骑上爱车&#xff0c;满血复活的准备开始新的一天。您会愿意带着如何给心爱的两轮车充电的担心开始这一天吗&#xff1f; 随着越来越…

MySQL---触发器

一、介绍 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前(BEFORE)或之后(AFTER)&#xff0c;触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性, 日志记录 , 数据校验等操作 。 使用别名OLD和NEW来引用触…

CorelDRAW25.0.0.230中文最新开心和谐版本

CorelDRAW是一款非常流行的矢量图形设计软件&#xff0c;其25.0.0.230版本带来了许多新特性和更新内容。以下是我所能提供的相关信息&#xff1a; 首先&#xff0c;关于特性方面&#xff0c;CorelDRAW 25.0.0.230版本具有强大的矢量编辑功能&#xff0c;用户可以轻松创建和编辑…

DSVPN实验报告

一、分析要求 1. 配置R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;所有地址均配为公有IP地址。 - 在R5上&#xff0c;将接口配置为公有IP地址&#xff0c;并确保只进行了IP地址配置。 2. R1和R5之间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b;R2于R5之间…

ES6 学习(三)-- es特性

文章目录 1. Symbol1.1 使用Symbol 作为对象属性名1.2 使用Symbol 作为常量 2. Iterator 迭代器2.1 for...of循环2.2 原生默认具备Interator 接口的对象2.3 给对象添加Iterator 迭代器2.4 ... 解构赋值 3. Set 结构3.1 初识 Set3.2 Set 实例属性和方法3.3 遍历3.4 相关面试题 4…

a = 3中的3在栈中还是堆中?

1、栈区&#xff08;stack&#xff09; 由编译器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量的值等。 2、堆区&#xff08;heap&#xff09; 是一个可动态申请的内存空间&#xff08;其记录空闲内存空间的链表由操作系统维护&#xff09;&#xff0c;在j…

基于js css的瀑布流demo

要实现照片按照瀑布流展示&#xff0c;写个小demo&#xff0c;记录下。 瀑布流实现思路如下&#xff1a; CSS 弹性布局对 3 列按横向排列&#xff0c;对每一列内部按纵向排列 html代码&#xff1a; <div class"content"></div> css代码&#xff1a; …

基于SSM学生信息管理系统

采用技术 基于SSM学生信息管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 总体功能设计 登录页面 后台首页 学生信息页面 添加学生用户 编辑…

动态规划刷题(算法竞赛、蓝桥杯)--导弹拦截(线性DP)

1、题目链接&#xff1a;[NOIP1999 提高组] 导弹拦截 - 洛谷 #include <bits/stdc.h> using namespace std; const int N2e55; int a[N],x,n; int b[N],len;int main(){while(cin>>x)a[n]x;//求最长不上升子序列 b[0]2e9;//初始化为无穷大for(int i1;i<n;i){if(…

计算机专业在找工作时的注意事项

目录 说在前面关于我一些忠告关于简历关于银行写在最后 说在前面 满满的求生欲。我不是什么大佬&#xff0c;更没有能力教大家什么。只是看到有不少学弟学妹&#xff0c;还在为找一份工作焦头烂额&#xff0c;却没有努力的方向。所以这里斗胆给计算机相关专业的学弟学妹们的一…

进程知识点

引用的文章&#xff1a;操作系统——进程通信&#xff08;IPC&#xff09;_系统ipc-CSDN博客 面试汇总(五)&#xff1a;操作系统常见面试总结(一)&#xff1a;进程与线程的相关知识点 - 知乎 (zhihu.com) 二、进程的定义、组成、组成方式及特征_进程的组成部分必须包含-CSDN博…

江协科技STM32:按键控制LED光敏传感器控制蜂鸣器

按键控制LED LED模块 左上角PA0用上拉输入模式&#xff0c;如果此时引脚悬空&#xff0c;PA0就是高电平&#xff0c;这种方式下&#xff0c;按下按键&#xff0c;引脚为低电平&#xff0c;松下按键&#xff0c;引脚为高电平 右上角PA0&#xff0c;把上拉电阻想象成弹簧 当按键…

c++中的菱形继承

c中的菱形继承 class Animal { public:int m_age; }; class Sheep:public Animal {}; class Tuo:public Animal{}; class SheepTuo :public Sheep , public Tuo{}; SheepTuo st; st.m_age 18; m_age是谁的无法区分 class Animal { public:int m_age; }; class Sheep:virtua…

李宏毅【生成式AI导论 2024】第5讲 让语言模型彼此合作,把一个人活成一个团队

GPD4,它也有非常强大的能力。但是GPT4如果跟其他的语言模型合作,他们其实可以发挥1加1大于二的力量。 为什么要让模型合作? 那怎么让模型彼此合作呢?有很多不同的方式。一个可能性是假设你现在手边就有一堆语言模型,他们可能有不同的能力使用,他们可能有不同的成本局来…

国外的Java面试题和国内的相比谁更卷

前言 有很多朋友很好奇国外的Java面试题长啥样&#xff0c;今天我们就去找5道国外的面试来和国内的对比一下看看谁难一些&#xff01; 面试题分享 1. Is Java Platform Independent if then how?&#xff08; Java平台是独立的吗&#xff1f;&#xff09; Yes, Java is a…

[数据结构]插入和希尔排序

一、插入排序 插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴&#xff0c;但它的原理应该是最容易理解的了&#xff0c;因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法&#xff0c;它的工作原理是通过构建有序序列&#xff0c;对于未排…

win10微软拼音输入法 - bug - 在PATH变量为空的情况下,无法输入中文

文章目录 win10微软拼音输入法 - bug - 在PATH变量为空的情况下&#xff0c;无法输入中文概述笔记实验前提条件100%可以重现 - 无法使用win10拼音输入法输入中文替代的输入法软件备注END win10微软拼音输入法 - bug - 在PATH变量为空的情况下&#xff0c;无法输入中文 概述 在…