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

状态模式(State Pattern)

状态模式(State Pattern)
如果任务的执行过程是有多个不同状态的(比如初始化、运行中、完成等),你可以使用状态模式。每个状态可以有不同的行为,使得任务的状态管理更加清晰和可维护。

示例:
class TaskState {
public:virtual void handle() = 0;  // 处理状态
};class InitializedState : public TaskState {
public:void handle() override {// 初始化状态下的处理}
};class RunningState : public TaskState {
public:void handle() override {// 运行状态下的处理}
};class Task {
private:TaskState *state;public:void setState(TaskState *state) {this->state = state;}void run() {state->handle();}
};






状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,从而让对象看起来像是改变了其类。这种模式非常适合处理对象在不同状态下具有不同行为的场景。

状态模式的核心概念

  1. Context(上下文)

    • 包含一个对状态对象的引用,通过这个引用调用状态对象的方法。
    • 客户端通过上下文对象与状态对象交互。
  2. State(状态接口)

    • 定义了一个接口,用于封装与状态相关的操作。
    • 所有具体状态类都实现这个接口。
  3. ConcreteState(具体状态类)

    • 实现了状态接口,具体定义了对象在某个状态下的行为。
    • 可以访问上下文对象,以便在需要时改变上下文的状态。

示例代码解析

以下是一个完整的状态模式示例,包括上下文类、状态接口和具体状态类。

1. 状态接口(State)
class TaskState {
public:virtual ~TaskState() {}virtual void handle(Task* task) = 0;  // 处理状态
};
2. 具体状态类(ConcreteState)
class InitializedState : public TaskState {
public:void handle(Task* task) override {std::cout << "Task is in Initialized State" << std::endl;// 初始化状态下的处理逻辑// 可以在这里改变任务的状态task->setState(new RunningState());}
};class RunningState : public TaskState {
public:void handle(Task* task) override {std::cout << "Task is in Running State" << std::endl;// 运行状态下的处理逻辑// 可以在这里改变任务的状态task->setState(new CompletedState());}
};class CompletedState : public TaskState {
public:void handle(Task* task) override {std::cout << "Task is in Completed State" << std::endl;// 完成状态下的处理逻辑// 任务完成,不再改变状态}
};
3. 上下文类(Context)
class Task {
private:TaskState* state;public:Task() : state(nullptr) {}void setState(TaskState* newState) {if (state) {delete state;  // 释放旧状态}state = newState;}void run() {if (state) {state->handle(this);  // 调用当前状态的处理方法}}~Task() {if (state) {delete state;  // 释放状态对象}}
};

使用示例

以下是如何使用状态模式来管理任务状态的示例:

#include <iostream>int main() {// 创建任务对象Task task;// 设置初始状态为初始化状态task.setState(new InitializedState());// 运行任务task.run();  // 输出: Task is in Initialized Statetask.run();  // 输出: Task is in Running Statetask.run();  // 输出: Task is in Completed Statereturn 0;
}

输出

Task is in Initialized State
Task is in Running State
Task is in Completed State

状态模式的用途

  1. 清晰的状态管理

    • 状态模式将每个状态的行为封装在独立的类中,使得状态管理更加清晰和可维护。
    • 每个状态类只关注自己的行为,符合单一职责原则。
  2. 动态状态切换

    • 对象可以在运行时动态切换状态,而不需要在上下文类中编写大量的条件语句。
    • 状态的切换逻辑由状态类本身管理,减少了上下文类的复杂性。
  3. 扩展性

    • 添加新的状态时,只需添加一个新的状态类,而不需要修改现有的上下文类或状态类。
    • 符合开闭原则(对扩展开放,对修改封闭)。

与状态观测器的关系

状态模式和状态观测器(Observer Pattern)是两种不同的设计模式,但它们可以结合使用:

  • 状态模式

    • 主要用于管理对象的内部状态和行为。
    • 通过状态类的切换来改变对象的行为。
  • 状态观测器(Observer Pattern)

    • 主要用于实现对象之间的依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。
    • 适用于多对多的依赖关系,例如事件驱动系统。

结合使用示例

假设你需要在任务状态改变时通知其他对象,可以结合状态模式和状态观测器模式:

  1. 定义 Observer 接口

    class Observer {
    public:virtual void update(const std::string& message) = 0;
    };
    
  2. 定义 Subject 类

    class Subject {
    private:std::vector<Observer*> observers;
    public:void attach(Observer* observer) {observers.push_back(observer);}void notify(const std::string& message) {for (Observer* observer : observers) {observer->update(message);}}
    };
    
  3. 让 Task 类继承 Subject

    class Task : public Subject {
    private:TaskState* state;public:Task() : state(nullptr) {}void setState(TaskState* newState) {if (state) {delete state;}state = newState;notify("Task state changed");  // 通知观察者}void run() {if (state) {state->handle(this);}}~Task() {if (state) {delete state;}}
    };
    
  4. 定义具体的 Observer

    class TaskLogger : public Observer {
    public:void update(const std::string& message) override {std::cout << "Log: " << message << std::endl;}
    };
    
  5. 使用示例

    int main() {Task task;task.attach(new TaskLogger());task.setState(new InitializedState());task.run();task.run();task.run();return 0;
    }
    

输出

Log: Task state changed
Task is in Initialized State
Log: Task state changed
Task is in Running State
Log: Task state changed
Task is in Completed State

总结

  • 状态模式:用于管理对象的内部状态和行为,通过状态类的切换来改变对象的行为。
  • 状态观测器模式:用于实现对象之间的依赖关系,当一个对象的状态改变时,通知所有依赖于它的对象。
  • 结合使用:可以通过状态模式管理状态,同时使用状态观测器模式通知其他对象状态的变化。

希望这些解释和示例能帮助你更好地理解状态模式及其用途。

相关文章:

状态模式(State Pattern)

状态模式&#xff08;State Pattern&#xff09; 如果任务的执行过程是有多个不同状态的&#xff08;比如初始化、运行中、完成等&#xff09;&#xff0c;你可以使用状态模式。每个状态可以有不同的行为&#xff0c;使得任务的状态管理更加清晰和可维护。 示例&#xff1a; …...

Linux网站搭建(新手必看)

1.宝塔Linux面板的功能 宝塔面板是一款服务器管理软件&#xff0c;可以帮助用户建立网站&#xff0c;一键配置服务器环境&#xff0c;使得用户通过web界面就可以轻松的管理安装所用的服务器软件。 2. 宝塔Linux面板的安装 宝塔官网地址&#xff1a;宝塔面板 - 简单好用的Linu…...

JavaEE进阶---Mybatis(预编译SQL即时SQL动态SQL标签池化技术说明)

文章目录 1.经典面试题&#xff08;#{}和${}的区别&#xff09;1.1关于#1.2关于$1.3情况下需要使用$ 2.数据库连接池2.1池化技术图解 3.动态SQL3.1if标签的使用3.2where标签的使用3.3set标签的使用 1.经典面试题&#xff08;#{}和${}的区别&#xff09; 1.1关于# 预编译SQL&a…...

Object.defineProperty()Proxy详解(Vue23数据劫持实现)

底层原理&#x1f447;&#x1f3ff; 总结一下&#xff0c;结构应该包括&#xff1a; 1. 方法的基本作用和参数。 2. 数据描述符和存取描述符的区别。 3. 属性定义的内部处理流程。 4. 在Vue中的应用实例。 5. 常见错误和正确实践。 每个部分都要结合搜索结果的信息&…...

网页的性能优化

面试中如何回答"前端性能优化"问题 在面试中回答性能优化问题时&#xff0c;建议采用结构化表达方式&#xff0c;展示你的系统化思维和实战经验。以下是一个推荐的回答框架&#xff1a; 1. 开场概述 “前端性能优化是一个系统工程&#xff0c;我通常会从加载性能、…...

Vue 3中的Teleport:超越组件边界的渲染

Vue 3引入了许多新特性&#xff0c;其中之一便是Teleport。它为开发者提供了一种强有力的方式来控制组件的渲染位置&#xff0c;使得我们可以将组件的内容“传送”到DOM树的任何地方&#xff0c;而不仅仅局限于其父级组件的边界内。这在创建模态框、通知系统或任何需要脱离当前…...

JVM垃圾回收笔记01-垃圾回收算法

文章目录 前言1. 如何判断对象可以回收1.1 引用计数法1.2 可达性分析算法查看根对象哪些对象可以作为 GC Root ?对象可以被回收&#xff0c;就代表一定会被回收吗&#xff1f; 1.3 引用类型1.强引用&#xff08;StrongReference&#xff09;2.软引用&#xff08;SoftReference…...

3.26学习总结

今天主要学习了内部类&#xff0c;但总感觉有点混乱&#xff0c;和之前的抽象啊&#xff0c;接口&#xff0c;多态等概念联系在一起感觉更混乱了&#xff0c;所以打算先把最近学的理清一遍&#xff0c;敲一遍代码再往后学...

京东--数据开发实习生--保险业务部门--一面凉经

Base&#xff1a; 本人投递的是后台开发岗位&#xff0c;调剂到数据开发岗位&#xff0c;京东的数据开发也做后台开发方面的工作&#xff0c;还包括算法、策略、数据挖掘和数据平台搭建之类的职责。面试内容基本只会问简历上的&#xff0c;在此基础上再去考察岗位职责相关的内…...

【Hugging Face 开源库】Diffusers 库 —— 扩散模型

Diffusers 的三个主要组件1. DiffusionPipeline&#xff1a;端到端推理工具__call__ 函数callback_on_step_end 管道回调函数 2. 预训练模型架构和模块UNetVAE&#xff08;Variational AutoEncoder&#xff09;图像尺寸与 UNet 和 VAE 的关系EMA&#xff08;Exponential Moving…...

TypeScript(TS) 的使用初识

我将详细讲解 TypeScript&#xff08;TS&#xff09; 的使用。TypeScript 是由微软开发的一种开源编程语言&#xff0c;它是 JavaScript 的超集&#xff0c;通过引入静态类型和面向对象编程特性&#xff0c;增强了 JavaScript 的开发体验和代码质量。TypeScript 最终会被编译成…...

QTcpSocket多线程连接慢问题

20250325记录 环境&#xff1a;Qt5.14.2 64位 msvc编译 在多线程环境下&#xff0c;使用QTcpSocket实现客户端&#xff0c;发现在少部分电脑上&#xff0c;连接时间过长&#xff0c;定时器检查套接字状态时&#xff0c;发现连接处于QAbstractSocket::ConnectingState状态。 …...

Vue的实例

Every Vue application starts with a single Vue component instance as the application root. Any other Vue component created in the same application needs to be nested inside this root component. 每个 Vue 应用都以一个 Vue 组件实例作为应用的根开始。在同一个应…...

[AI绘图] ComfyUI 中自定义节点插件安装方法

ComfyUI 是一个强大的 AI 图像生成工具,支持自定义节点插件扩展其功能。本文介绍 ComfyUI 中安装自定义节点插件的三种方法,包括 Git Clone 方式、插件管理器安装方式,以及手动解压 ZIP 文件的方法,并分析它们的优缺点。 1. Git Clone 方法 使用 git clone 是最稳定且推荐…...

数据库第二周作业

数据库约束、常见语句等 数据库约束 主键约束 #创建表&#xff0c;把id设为主键 mysql> create table test02(-> id int primary key, #----主键约束-> name varchar(50)-> ); Query OK, 0 rows affected (0.02 sec) ​ #插入数据测试 mysql> insert into te…...

Appium Inspector使用教程

1.下载最新版本 https://github.com/appium/appium-inspector/releases 2.本地启动一个Appium服务 若Android SDK已安装Appium服务&#xff0c;则在任意terminal使用appium启动服务即可 3.Appium Inspector客户端配置连接到Appium服务 Configuring and Starting a Session…...

【QT继承QLabel实现绘制矩形、椭圆、直线、多边形功能,并且支持修改大小,移动位置,复制,粘贴,删除功能】

文章目录 介绍绘制一个矩形&#xff08;椭圆&#xff09;roi绘制一个多边形roi对矩形roi的缩放&#xff1a;对多边形rio的缩放&#xff08;移动点的位置&#xff09; 介绍 绘制矩形&#xff0c;椭圆&#xff0c;直线实际用的都是是同一个思路&#xff1a;鼠标第一次点击就确定…...

Elasticsearch未授权访问漏洞

1、编辑elasticsearch.yml配置文件&#xff0c;添加认证相关配置 vim elasticsearch.ymlxpack.security.enabled: true xpack.license.self_generated.type: basic xpack.security.transport.ssl.enabled: true2、重启ElasticSearch # 重启方式可能略微不同 systemctl restar…...

怎么处理 Vue 项目中的错误的?

一、错误类型 任何一个框架,对于错误的处理都是一种必备的能力 在Vue 中,则是定义了一套对应的错误处理规则给到使用者,且在源代码级别,对部分必要的过程做了一定的错误处理。 主要的错误来源包括: 后端接口错误代码中本身逻辑错误二、如何处理 后端接口错误 通过axi…...

Elasticsearch原生linux部署集群 和docker部署集群

Easticsearch 是一个分布式的搜索和分析引擎&#xff0c;广泛应用于日志分析、全文检索、实时数据分析等场景。为了满足高可用性和高性能的需求&#xff0c;Elasticsearch 通常以集群的方式部署。部署 Elasticsearch 集群时&#xff0c;可以选择两种主要方式&#xff1a;原生 L…...

缓存设计模式

缓存设计模式&#xff08;Cache Design Pattern&#xff09;是一种用于存储和管理频繁访问数据的技术&#xff0c;旨在提高系统性能、降低数据库或后端服务的负载&#xff0c;并减少数据访问延迟。以下是几种常见的缓存设计模式&#xff0c;并用 Python Redis 进行示例代码实现…...

详解TCP的四次握手和三次挥手,以及里面每个阶段的状态

TCP 三次握手&#xff08;连接建立&#xff09; TCP 连接建立通过三次握手完成&#xff0c;确保双方同步初始序列号并确认可达性。 阶段说明 第一次握手 客户端 → 服务器&#xff1a;发送 SYN&#xff08;同步请求&#xff09;&#xff0c;携带初始序列号 seq x。客户端状态…...

Linux文件目录管理指令详解(上篇)

Linux文件目录管理指令详解&#xff08;上篇&#xff09; 在Linux操作系统中&#xff0c;文件目录管理是基础且重要的技能。通过一系列指令&#xff0c;用户可以高效地浏览、创建、修改和删除文件及目录。本文将详细介绍Linux中常用的文件目录管理类指令&#xff0c;包括pwd、…...

BCC-应用程序组件分析

libbpf-tools/gethostlatency 追踪glibc中的getaddrinfo、gethostbyname、gethostbyname2函数用时 # /usr/share/bcc/libbpf-tools/gethostlatency TIME PID COMM LATms HOST 14:58:32 8418 curl 313.635 www.taobao.com以# cur…...

无参数读文件和RCE

什么是无参数&#xff1f; 无参数&#xff08;No-Argument&#xff09;的概念&#xff0c;顾名思义&#xff0c;就是在PHP中调用函数时&#xff0c;不传递任何参数。我们需要利用仅靠函数本身的返回值或嵌套无参数函数的方式&#xff0c;达到读取文件或远程命令执行&#xff0…...

SpringMVC_day02

一、SSM 整合 核心步骤 依赖管理 包含 SpringMVC、Spring JDBC、MyBatis、Druid 数据源、Jackson 等依赖。注意点&#xff1a;确保版本兼容性&#xff08;如 Spring 5.x 与 MyBatis 3.5.x&#xff09;。 配置类 SpringConfig&#xff1a;扫描 Service 层、启用事务管理、导入…...

在Linux、Windows系统上安装开源InfluxDB——InfluxDB OSS v2并设置开机自启的保姆级图文教程

一、进入InfluxDB下载官网 InfluxData 文档https://docs.influxdata.com/Install InfluxDB OSS v2 | InfluxDB OSS v2 Documentation...

LinkedIn数据抓取零风险指南:亮数据住宅代理实现企业级合规采集

亮数据住宅代理实现企业级合规采集 一、前言二、尝试使用三、使用体验高效稳定易用性&#xff1a;合规与安全&#xff1a;技术支持&#xff1a; 四、适用场景五、推荐程度六、试用地址 一、前言 最近一位猎头小伙伴找到我&#xff0c;说目前很多公司的出海业务都在招人&#x…...

ROS2的发展历史、核心架构和应用场景

以下是对**ROS2&#xff08;Robot Operating System 2&#xff09;**的发展历史、核心架构和应用场景的详细解析&#xff0c;覆盖其技术演变、关键特性和生态系统&#xff1a; 一、ROS2的诞生背景&#xff1a;从ROS1到ROS2 1. ROS1的历史与局限 ROS1的起源&#xff1a; 2007年…...

PHP eval 长度限制绕过与 Webshell 获取

在 PHP 代码中&#xff0c;如果 eval($param); 存在且长度受限&#xff0c;并且过滤了 eval 和 assert&#xff0c;仍然可以通过多种方法绕过限制&#xff0c;获取 Webshell。 源码 <?php $param $_REQUEST[param]; if(strlen($param)<17 && stripos($param,…...

自然语言处理(14:处理时序数据的层的实现)

系列文章目录 第一章 1:同义词词典和基于计数方法语料库预处理 第一章 2:基于计数方法的分布式表示和假设&#xff0c;共现矩阵&#xff0c;向量相似度 第一章 3:基于计数方法的改进以及总结 第二章 1:word2vec 第二章 2:word2vec和CBOW模型的初步实现 第二章 3:CBOW模型…...

Pytest的Fixture使用

概述 Pytest中的Fixture可以使得测试代码高度复用,同时对资源进行安全的管理,以及在复杂的测试场景用进行灵活的组合。 概念 Fixture:可重用的函数,用@pytest.fixture来进行装饰,用于为测试提供数据、环境或者服务作用域:控制Fixture的生命周期,默认是function,可设置…...

【蓝桥杯】每日练习 Day13

前言 今天做了不少题&#xff0c;但是感觉都太水了&#xff0c;深思熟虑之下主播决定拿出两道相对不那么水的题来说一下&#xff08;其实还是很水&#xff09;。 两道问题&#xff0c;一道是日期问题&#xff08;模拟&#xff09;&#xff0c;一道是区间合并问题。 日期差值 …...

Vue3 中使用 vuedraggable 实现拖拽排序功能,分组拖拽

Vue3 中使用 vuedraggable 实现拖拽排序功能&#xff0c;分组拖拽 安装draggable npm install vuedraggablenext --save基础用法示例 <template><div class"app-container"><draggable v-model"list" item-key"id":group"…...

husky的简介以及如果想要放飞自我的解决方案

husky 是一个 Git Hooks 管理工具&#xff0c;它的主要作用是 在 Git 提交&#xff08;commit&#xff09;、推送&#xff08;push&#xff09;等操作时执行自定义脚本&#xff0c;比如代码检查&#xff08;Lint&#xff09;、单元测试&#xff08;Test&#xff09;、格式化代码…...

Maven工具学习使用(四)——仓库

仓库分类 对于Mavne来说,仓库只分为两类:本地仓库和远程仓库。当Maven根据坐标查询寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven就会去远程仓库查找,发现需要的构件之后…...

【BFS】《单源、多源 BFS:图搜索算法的双生力量》

文章目录 前言单源BFS例题一、迷宫中离入口最近的出口二、 最小基因变化三、单词接龙四、为高尔夫比赛砍树 多源BFS例题一、 01 矩阵二、飞地的数量三、地图中的最高点四、地图分析 结语 前言 什么是单源、多源BFS算法问题呢&#xff1f; BFS&#xff08;Breadth - First Sear…...

批量取消 PDF 文档中的所有超链接

在 PDF 文档中我们可以插入各种各样的文本也可以给文本设置字体&#xff0c;颜色等多种样式&#xff0c;同时还可以给文字或者图片添加上超链接&#xff0c;当我们点击超链接之后&#xff0c;就会跳转到对应的网页。有时候这会对我们的阅读或者使用形成一定的干扰&#xff0c;今…...

13.2 kubelet containerRuntime接口定义和初始化

本节重点总结 &#xff1a; containerRuntime 需要实现3类接口 管理容器的接口管理镜像的接口Streaming API 用于客户端与容器进行交互 type KubeGenericRuntime interface {kubecontainer.Runtimekubecontainer.StreamingRuntimekubecontainer.CommandRunner }containerRun…...

使用 gone.WrapFunctionProvider 快速接入第三方服务

项目地址&#xff1a;https://github.com/gone-io/gone 本文中源代码&#xff1a; esexamples/es 文章目录 1. gone.WrapFunctionProvider 简介2. 配置注入实现3. 实战示例&#xff1a;Elasticsearch 集成4. 使用方式5. 最佳实践6. 总结 在如何给Gone框架编写Goner组件&#xf…...

git 标签学习笔记

目录 轻量级标签 带注释的标签&#xff08;推荐&#xff09; 给指定 commit 打标签 推送单个标签&#xff0c;需要单独推送&#xff0c;代码推送不会推送标签 推送所有标签 删除标签 轻量级标签 git tag v1.0.0 只是简单地给当前 commit 打上 v1.0.0 标签。 带注释的标…...

【论文阅读】基于思维链提示的大语言模型软件漏洞发现与修复方法研究

这篇文章来自于 Chain-of-Thought Prompting of Large Language Models for Discovering and Fixing Software Vulnerabilities 摘要 软件安全漏洞在现代系统中呈现泛在化趋势&#xff0c;其引发的社会影响日益显著。尽管已有多种防御技术被提出&#xff0c;基于深度学习&…...

企业在人工智能创新与安全之间走钢丝

2025 年全球 AI/ML 工具使用量将激增&#xff0c;企业将 AI 融入运营之中&#xff0c;员工也将 AI 嵌入日常工作流程中。报告显示&#xff0c;企业对 AI/ML 工具的使用同比增长 3,000% 以上&#xff0c;凸显了各行各业迅速采用 AI 技术&#xff0c;以提升生产力、效率和创新水平…...

CSS动画

目录 一、核心概念与语法 1. keyframes 关键帧 2. animation 属性 二、动画调速函数&#xff08;animation-timing-function&#xff09; 1. 预设值 2. 贝塞尔曲线 3. 步进函数&#xff08;steps()&#xff09; 三、动画控制与交互 1. 暂停与恢复 2. JavaScript 控制…...

计算机视觉(CV)技术的优势和挑战

计算机视觉&#xff08;CV&#xff09;技术是人工智能领域中的一个重要分支&#xff0c;它主要通过让机器学会“看”和“理解”图像或视频来模拟人类视觉系统。以下是计算机视觉技术的一些优势和挑战&#xff1a; 优势&#xff1a; 自动化&#xff1a;计算机视觉技术可以实现…...

动态IP与静态IP该如何选?

一、当IP地址成为"网络身份" 2023年亚马逊封号潮中&#xff0c;某杭州卖家因登录IP频繁切换&#xff08;早8点在纽约&#xff0c;午间瞬移到东京&#xff09;&#xff0c;触发平台风控导致账号冻结。这类"时空错乱症"揭示了跨境电商的生存法则&#xff1a…...

Vue.js 完全指南:从入门到精通

1. Vue.js 简介 1.1 什么是 Vue.js? Vue.js(通常简称为 Vue)是一个用于构建用户界面的渐进式 JavaScript 框架。所谓"渐进式",意味着 Vue 的设计是由浅入深的,你可以根据自己的需求选择使用它的一部分或全部功能。 Vue 最初由尤雨溪(Evan You)在 2014 年创…...

《TypeScript 7天速成系列》第3天:TypeScript高级类型通关秘籍:泛型+联合+交叉类型实战

TypeScript 的类型系统是其最强大的特性之一&#xff0c;但也是许多开发者感到困惑的地方。今天我们就来破解 TypeScript 中最难的类型系统&#xff0c;掌握泛型、联合类型和交叉类型的使用技巧。 一、泛型函数与泛型接口 泛型是 TypeScript 中创建可重用组件的重要工具&…...

Python----数据分析(足球运动员数据分析)

一、数据展示 1.1、数据 1.2、列名 字段名备注Name姓名Nationality国籍National_Position国家队位置National_Kit国家队号码Club所在俱乐部Club_Position所在俱乐部位置Club_Kit俱乐部号码Club_Joining加入俱乐部时间Contract_Expiry合同到期时间Rating评分Height身高Weight体…...

音视频 三 看书的笔记 MediaPlayer的C/S架构

MediaPlayer在运行时分为Client和Server两部分 Client层‌&#xff1a;位于Java层&#xff0c;用户通过调用Java层的API&#xff08;如setDataSource&#xff09;来操作MediaPlayer。 Server层‌&#xff1a;位于C层&#xff0c;负责实际的媒体处理工作。Server层通过Binder机…...