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

Java设计模式:四、行为型模式-10:访问者模式

一、定义:访问者模式

请添加图片描述

  • 访问者模式:核心在于同一个事物不同视角下的访问信息不同。
    • 在一个稳定的数据结构下,例如用户信息、雇员信息等,增加易变的业务访问逻辑。
    • 为了增强扩展性,将两部分的业务解耦的一种设计模式。

二、模拟场景:模板模式

请添加图片描述

  • 模拟校园中的学生和老师对于不同用户的访问视角。
  • 在这个案例场景我们模拟校园中由学生和老师两种身份的用户,那么对于家长和校长关心的角度来看,他们的视角是不同的。
    • 家长更关心孩子的成绩和老师的能力,校长更关心老师所在班级学生的人数和升学率。
  • 那么这样 学生老师 就是一个固定信息的内容,而想让不同视角的用户获取关心的信息,就比较适合使用访问者模式来实现,从而让实体与业务解耦,增强扩展性。
    • 但访问者模式的整体类结构相对复杂,需要梳理清除再开发

三、改善代码:模访者模式

💡 访问者模式的类结构相对其他设计模式来说比较复杂,但这样的设计模式能阔开你对代码结构的新认知,用这样的思维不断的建设处更好的代码架构。

  • 这个案例的核心逻辑:
    • 建立用户抽象类和抽象访问方法,再由不同的用户实现:老师和学生。
    • 建立访问者接口,用于不同人员的访问操作:家长和校长。
    • 最终是对数据的看板建设,用于实现不同视角的访问结果输出。

3.0 引入依赖

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency><!-- LOGGING begin --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.5</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.7.5</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.0.9</version><exclusions><exclusion><artifactId>slf4j-api</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency>
</dependencies>

3.1 工程结构

design-step-22
|——src|——main|--java|--com.lino.design|--user|		|--impl|		|		|--Student.java|		|		|--Teacher.java|		|--User.java|--visitor|		|--impl|		|		|--Parent.java|		|		|--Principal.java|		|--Visitor.java|-DataView.java|--test|--com.lino.design.test|-ApiTest.java

3.2 访问者模式结构图

请添加图片描述

  • 上面的视图展示了代码的核心结构,主要包括不同视角下的不同用户访问模型。
  • 访问者模式的核心组成部分:visitor.visit(this) ,这个方法在每一个用户实现类里,包括:StudentTeacher

3.3 用户抽象类和实现

3.3.1 定义用户抽象类

User.java

package com.lino.design.user;import com.lino.design.visitor.Visitor;/*** @description: 用户类*/
public abstract class User {/*** 姓名*/public String name;/*** 身份:重点班、普通班 | 特级教师、普通教师、实习教师*/public String identity;/*** 班级*/public String clazz;public User(String name, String identity, String clazz) {this.name = name;this.identity = identity;this.clazz = clazz;}/*** 核心访问方法** @param visitor 访问者*/public abstract void accept(Visitor visitor);
}
  • 基本信息包括:姓名、身份、班级,也可以是一个业务用户属性类。
  • 定义核心抽象方法:abstract void accept(Visitor visitor) ,这个方法是为了让后续的用户具体实现者都能提供出一个访问方法,供外部使用。

3.3.2 实现用户信息-学生类

Student.java

package com.lino.design.user.impl;import com.lino.design.user.User;
import com.lino.design.visitor.Visitor;
import java.util.Random;/*** @description: 学生类*/
public class Student extends User {public Student(String name, String identity, String clazz) {super(name, identity, clazz);}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}/*** 排名*/public int ranking() {return (int) (Math.random() * 100);}/*** 数量*/public int count() {return 105 - new Random().nextInt(10);}
}

3.3.3 实现用户信息-老师类

Teacher.java

package com.lino.design.user.impl;import com.lino.design.user.User;
import com.lino.design.visitor.Visitor;
import java.math.BigDecimal;
import java.util.Random;/*** @description: 老师类*/
public class Teacher extends User {public Teacher(String name, String identity, String clazz) {super(name, identity, clazz);}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}/*** 升本率*/public double entranceRatio() {return BigDecimal.valueOf(Math.random() * 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();}
}
  • 这里实现了老师类和学生类,都提供了父类的构造函数。
    • accept 方法中,提供了本地对象的访问。visitor.visit(this);
  • 老师和学生类又都单独提供了各自的特性方法:升学率(entranceRatio)、排名(ranking),类似这样的方法可以按照业务需求进行扩展。

3.4 访问者接口及其实现

3.4.1 定义访问数据接口

Visitor.java

package com.lino.design.visitor;import com.lino.design.user.impl.Student;
import com.lino.design.user.impl.Teacher;/*** @description: 访问者接口*/
public interface Visitor {/*** 访问学生信息** @param student 学生类*/void visit(Student student);/*** 访问老师信息** @param teacher 老师类*/void visit(Teacher teacher);
}
  • 访问接口比较简单,相同的方法名称,不同的入参用户类型。
  • 让具体的访问者类,在实现时可以关注每一种用户类型的具体访问数据对象,例如:升学率和排名

3.4.2 访问者实现类-家长类

Parent.java

package com.lino.design.visitor.impl;import com.lino.design.user.impl.Student;
import com.lino.design.user.impl.Teacher;
import com.lino.design.visitor.Visitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @description: 家长类*/
public class Parent implements Visitor {private Logger logger = LoggerFactory.getLogger(Parent.class);@Overridepublic void visit(Student student) {logger.info("学生信息 姓名:{} 班级:{} 排名:{}", student.name, student.clazz, student.ranking());}@Overridepublic void visit(Teacher teacher) {logger.info("老师信息 姓名:{} 班级:{} 级别:{}", teacher.name, teacher.clazz, teacher.identity);}
}
  • 家长关注:自己家孩子的排名,老师的班级和教学水平。

3.4.3 访问者实现类-校长类

Principal.java

package com.lino.design.visitor.impl;import com.lino.design.user.impl.Student;
import com.lino.design.user.impl.Teacher;
import com.lino.design.visitor.Visitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @description: 校长类*/
public class Principal implements Visitor {private Logger logger = LoggerFactory.getLogger(Principal.class);@Overridepublic void visit(Student student) {logger.info("学生信息 班级:{} 人数:{}", student.clazz, student.count());}@Overridepublic void visit(Teacher teacher) {logger.info("老师信息 姓名:{} 班级:{} 升学率:{}", teacher.name, teacher.clazz, teacher.entranceRatio());}
}
  • 校长关注:学生的名称和班级,老师对这个班级的升学率。

3.5 数据看板

DataView.java

package com.lino.design;import com.lino.design.user.User;
import com.lino.design.user.impl.Student;
import com.lino.design.user.impl.Teacher;
import com.lino.design.visitor.Visitor;
import java.util.ArrayList;
import java.util.List;/*** @description: 数据看板*/
public class DataView {List<User> userList = new ArrayList<>();public DataView() {userList.add(new Student("谢飞机", "重点班", "一年一班"));userList.add(new Student("windy", "重点班", "一年一班"));userList.add(new Student("大毛", "普通班", "二年三班"));userList.add(new Student("Shing", "普通班", "三年四班"));userList.add(new Teacher("BK", "特级教师", "一年一班"));userList.add(new Teacher("娜娜Goddess", "特级教师", "一年一班"));userList.add(new Teacher("dangdang", "普通教师", "二年三班"));userList.add(new Teacher("泽东", "实习教师", "三年四班"));}public void show(Visitor visitor) {for (User user : userList) {user.accept(visitor);}}
}
  • 首先在这个类中初始化了基本的数据,学生和老师的信息。
  • 并提供了一个展示类,通过传入不同的 访问者(家长、校长) 而差异化的打印信息。

3.6 单元测试

ApiTest.java

package com.lino.design.test;import com.lino.design.DataView;
import com.lino.design.visitor.impl.Parent;
import com.lino.design.visitor.impl.Principal;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @description: 单元测试*/
public class ApiTest {private Logger logger = LoggerFactory.getLogger(ApiTest.class);@Testpublic void test_show() {DataView dataView = new DataView();logger.info("\r\n家长视角访问:");dataView.show(new Parent());logger.info("\r\n校长视角访问:");dataView.show(new Principal());}
}
  • 测试类提供了三个商品连接,也可以是其他商品的连接。
  • 爬取的成功模拟爬取京东商品,可以替换为其他商品服务。new JDNetMallnew DangDangNetMallnew TaoBaoNetMall

测试结果

14:14:27.268 [main] INFO  com.lino.design.test.ApiTest - 
家长视角访问:
14:14:27.273 [main] INFO  com.lino.design.visitor.impl.Parent - 学生信息 姓名:谢飞机 班级:一年一班 排名:47
14:14:27.273 [main] INFO  com.lino.design.visitor.impl.Parent - 学生信息 姓名:windy 班级:一年一班 排名:26
14:14:27.273 [main] INFO  com.lino.design.visitor.impl.Parent - 学生信息 姓名:大毛 班级:二年三班 排名:46
14:14:27.273 [main] INFO  com.lino.design.visitor.impl.Parent - 学生信息 姓名:Shing 班级:三年四班 排名:2
14:14:27.273 [main] INFO  com.lino.design.visitor.impl.Parent - 老师信息 姓名:BK 班级:一年一班 级别:特级教师
14:14:27.273 [main] INFO  com.lino.design.visitor.impl.Parent - 老师信息 姓名:娜娜Goddess 班级:一年一班 级别:特级教师
14:14:27.273 [main] INFO  com.lino.design.visitor.impl.Parent - 老师信息 姓名:dangdang 班级:二年三班 级别:普通教师
14:14:27.273 [main] INFO  com.lino.design.visitor.impl.Parent - 老师信息 姓名:泽东 班级:三年四班 级别:实习教师
14:14:27.273 [main] INFO  com.lino.design.test.ApiTest - 
校长视角访问:
14:14:27.273 [main] INFO  c.lino.design.visitor.impl.Principal - 学生信息 班级:一年一班 人数:102
14:14:27.273 [main] INFO  c.lino.design.visitor.impl.Principal - 学生信息 班级:一年一班 人数:103
14:14:27.273 [main] INFO  c.lino.design.visitor.impl.Principal - 学生信息 班级:二年三班 人数:98
14:14:27.273 [main] INFO  c.lino.design.visitor.impl.Principal - 学生信息 班级:三年四班 人数:99
14:14:27.273 [main] INFO  c.lino.design.visitor.impl.Principal - 老师信息 姓名:BK 班级:一年一班 升学率:45.81
14:14:27.273 [main] INFO  c.lino.design.visitor.impl.Principal - 老师信息 姓名:娜娜Goddess 班级:一年一班 升学率:27.52
14:14:27.273 [main] INFO  c.lino.design.visitor.impl.Principal - 老师信息 姓名:dangdang 班级:二年三班 升学率:51.94
14:14:27.273 [main] INFO  c.lino.design.visitor.impl.Principal - 老师信息 姓名:泽东 班级:三年四班 升学率:37.5
  • 通过测试结果可以看到,家长和校长的访问视角同步,数据也是差异化的。
  • 家长视角看到学生的排名:排名:47排名:26排名:46排名:2
  • 校长视角看到班级升学率:升学率:45.81升学率:27.52升学率:51.94升学率:37.5
  • 通过这样的测试结果,可以看到访问者模式的初心和结果,在适合的场景运用合适的模式,非常有利于程序开发。

四、总结:访问者模式

  • 通过上面的业务场景可以看到,在嵌入访问者模式后,可以让整个工程结构变得容易添加和修改。
    • 也就做到了系统之间的解耦,不至于为了不同类型信息的访问而增加很多多余的 if 判断或者类的强制转换。
    • 也就是通过这样的设计模式而让代码结构更加清晰。
  • 另外在实现的过程可能发现,定义抽象类的时候还需要等待访问者接口的定义
    • 这样的设计首先从实现上会让代码的组织变得有些难度。
    • 另外从设计模式原则的角度来看,违背了迪米特原则,也就是最少知道原则。
    • 因此在使用上一定要符合场景的运用,以及提取这部分设计思想的精髓。

相关文章:

Java设计模式:四、行为型模式-10:访问者模式

一、定义&#xff1a;访问者模式 访问者模式&#xff1a;核心在于同一个事物不同视角下的访问信息不同。 在一个稳定的数据结构下&#xff0c;例如用户信息、雇员信息等&#xff0c;增加易变的业务访问逻辑。为了增强扩展性&#xff0c;将两部分的业务解耦的一种设计模式。 二…...

【juc】读写锁ReentrantReadWriteLock

目录 一、说明二、读读不互斥2.1 代码示例2.2 截图示例 三、读写互斥3.1 代码示例3.2 截图示例 四、写写互斥4.1 代码示例4.2 截图示例 五、注意事项5.2.1 代码示例5.2.2 截图示例 一、说明 1.当读操作远远高于写操作时&#xff0c;使用读写锁让读读可以并发&#xff0c;来提高…...

Linux开机启动Tomcat

需求背景 Linux重启后要手动执行"startup.sh"启动Tomcat&#xff0c;比较麻烦&#xff0c;想要Linux开机启动Tomcat。 开机启动 #---------------------------------------------------------- sudo tee /usr/bin/tomcat.sh <<-EOF #! /bin/bash nohup /opt/to…...

javaweb、spring、springmvc和springboot有什么区别,都是做什么用的?

JavaWeb是一种基于Java技术的Web开发模式&#xff0c;用于构建动态的、可交互的Web应用程序。它是一种使用Java语言开发Web应用的技术堆栈&#xff0c;包括Java Servlet、JavaServer Pages&#xff08;JSP&#xff09;、JavaServer Faces&#xff08;JSF&#xff09;等。JavaWe…...

已解决module ‘pip‘ has no attribute ‘pep425tags‘报错问题(如何正确查看pip版本、支持、32位、64位方法汇总)

本文摘要&#xff1a;本文已解决module ‘pip‘ has no attribute ‘pep425tags‘的相关报错问题&#xff0c;并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。并且最后说明了如何正确查看pip版本、支持、32位、64位方法汇总 &#x1f60e; 作者介绍&…...

Matlab(画图初阶)

目录 1.plot()函数 2. hold(添加新绘图是否保留旧绘图) 3. Plot Style 3.1 线型 3.2 标记 3.3 颜色 ​编辑 4. legend() 5.X 、Y and Title&#xff1f; 6. Text()和annotation() 7.line(创建基本线条) 7.1 基本语法 7.2 指定线条属性 7.3 更改线条属性 8.图像属性 8.1 …...

汽车自适应巡航系统控制策略研究

目 录 第一章 绪论 .............................................................................................................................. 1 1.1 研究背景及意义 ..........................................................................................…...

C语言面试题值反转字符串

知识捡漏本 1.C语言优先级 &#xff1a;左高于高于 右 2.定义宏函数product&#xff0c;调用product后&#xff0c;里面的i和i都是加两次1&#xff0c;i就是两个加2后的i相乘&#xff0c;i是开始的i和1后的i相乘。 3.用i (j4,k 8,m 16);这种定义方法&#xff0c;最终i和最后一…...

【大数据】Apache Iceberg 概述和源代码的构建

Apache Iceberg 概述和源代码的构建 1.数据湖的解决方案 - Iceberg1.1 Iceberg 是什么1.2 Iceberg 的 Table Format 介绍1.3 Iceberg 的核心思想1.4 Iceberg 的元数据管理1.5 Iceberg 的重要特性1.5.1 丰富的计算引擎1.5.2 灵活的文件组织形式1.5.3 优化数据入湖流程1.5.4 增量…...

对分库分表进行批量操作

对ShardingJDBC基础了解&#xff1a;https://blog.csdn.net/m0_63297646/article/details/131894472 对批量操作案例&#xff1a;https://blog.csdn.net/m0_63297646/article/details/131843517 分为db0和db1两个库&#xff0c;每个库都有三张订单表&#xff0c;分表键根据年份…...

大数据组件-Flume集群环境的启动与验证

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…...

【包过滤防火墙——iptables静态防火墙】的简单使用

文章目录 规则链的分类--五链处理的动作iptables常用参数和作用 防火墙就是堵和通的作用 iptables &#xff1a;包过滤防火墙&#xff0c;是内核防火墙netfilter的管理工具 核心&#xff1a;四表五链 规则链的分类–五链 在进行路由选择前处理的数据包&#xff1a;PREROUTIN…...

关于MySQL数据库版本不同导致表进行比较的时候报错illegal mix of collations...的问题

问题发生的原委 之前在项目开发的时候&#xff0c;我本地也建立了数据库用作开发库&#xff0c;我本地的数据库版本是5.7的&#xff0c;但是测试和生产库都是8.0的版本&#xff0c;我们定义的数据库字符集是utf8mb4&#xff0c;排序规则是utf8mb4_general_ci&#xff0c;前段时…...

进程、操作系统

文章目录 一、冯诺依曼体系&#xff08;Von Neumann Architecture&#xff09;1. 概述2. CPU 二、操作系统&#xff08;Operating System&#xff09;三、进程(process)/任务(task) 一、冯诺依曼体系&#xff08;Von Neumann Architecture&#xff09; 1. 概述 分类 CPU 中央处…...

hadoop学习:mapreduce入门案例四:partitioner 和 combiner

先简单介绍一下partitioner 和 combiner Partitioner类 用于在Map端对key进行分区 默认使用的是HashPartitioner 获取key的哈希值使用key的哈希值对Reduce任务数求模决定每条记录应该送到哪个Reducer处理自定义Partitioner 继承抽象类Partitioner&#xff0c;重写getPartiti…...

HTTP与SOCKS5的区别对比

在互联网世界中&#xff0c;服务器是一种重要的工具&#xff0c;可以帮助我们提高网络安全性等。今天&#xff0c;我们将重点关注两种常见的技术&#xff1a;HTTP和SOCKS5。让我们深入了解它们的工作原理、用途和优缺点&#xff0c;并通过Python代码示例学习如何使用它们。 HT…...

在阿里云请求发短信接口去掉证书验证

composer require alibabacloud/dysmsapi-20170525 2.0.23 cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://dysmsapi.aliyuncs.com/?PhoneNumbers 两种方法 第一…...

k8s里pv pvc configmap

通过storageClassName 将PV 和PVC 关联起来。 [rootk8-master home]# cat /home/npm-pvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata:name: npm-repository-pvcnamespace: jenkins spec:accessModes:- ReadWriteManyresources:requests:storage: 50GistorageC…...

【Atcoder】 [ARC144D] AND OR Equation

题目链接 Atcoder方向 Luogu方向 题目解法 考虑满足条件 2 2 2 的形式为 a n p 0 ∑ i ∈ n p i a_np_0\sum\limits_{i\in n}p_i an​p0​i∈n∑​pi​ 这是一步很巧妙的转化&#xff0c;神奇地利用了 & \& & 和 ∣ | ∣ 的性质&#xff0c;把求 a a a 的…...

python使用字典暴力解析wifi密码

前言 最近无wifi可用,搜到了很多高质量但是没有密码的WiFi,我在想应该可以用python调用常见的wifi字典包来暴力破解一下这些WiFi,也许可以成功 原理 使用pip install pywifi命令安装pywifi 使用它调用本机网卡,设置wifi加密方式,对字典包扫描密码逐个尝试 扫描失败的密码会被…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...