设计模式: 行为型之中介者模式(18)

Java设计模式原则及中介者模式研究 在该系统中,为了实现对不同生理参数的监测和数据分析,设计者采用了模块化的设计方法,并通过定义抽象的接口来实现各个模块之间的交互。同时,随着技术的不断进步和创新,我们也可以期待更多新的设计模式和编程思想的出现,为软件开发领域注入新的活力和动力。这些原则为开发者提供了在设计类、接口以及它们之间的交互时应遵循的准则,有助于减少代码的耦合性,增加系统的可扩展性和可维护性。里氏替换原则指出,在程序中,如果S是T的子类型,那么程序中使用类型T的对象的地方都可以用类型S的对象来替换,而程序的行为不会发生变化。 阅读详情

中介者模式概述

  • 中介者模式(Mediator Pattern)是一种行为设计模式,它用于减少对象之间的直接交互,从而使其可以松散耦合
  • 中介者模式通过引入一个中介者对象来协调多个对象之间的交互,使得这些对象不需要知道彼此的具体实现,只需与中介者进行通信
  • 中介者模式结构
    • 中介者(Mediator)
      • 定义了一个接口,用于与各同事对象通信
    • 具体中介者(ConcreteMediator)
      • 实现中介者接口,协调各个同事对象之间的交互
      • 并可以维护同事对象之间的引用关系
    • 同事类(Colleague)
      • 每一个同事对象都知道中介者对象,并与它通信
      • 但不知道其他同事对象,同事对象之间的交互通过中介者对象来完成

中介者模式应用

// 1. 定义同事类(Colleague)接口
interface Colleague {
  name: string;
  mediator: Mediator;
  send(message: string): void;
  receive(message: string): void;
}

// 2. 定义中介者(Mediator)接口
interface Mediator {
  register(colleague: Colleague): void;
  sendMessage(sender: string, message: string): void;
}

// 3. 创建具体同事类
class ConcreteColleagueA implements Colleague {
  mediator: Mediator;
  name: string;

  constructor(name: string, mediator: Mediator) {
    this.mediator = mediator;
    this.name = name;
  }

  send(message: string): void {
    this.mediator.sendMessage(this.name, message);
  }

  receive(message: string): void {
    console.log(`${this.name} received the message: ${message}`);
  }
}

class ConcreteColleagueB implements Colleague {
  mediator: Mediator;
  name: string;

  constructor(name: string, mediator: Mediator) {
    this.mediator = mediator;
    this.name = name;
  }

  send(message: string): void {
    this.mediator.sendMessage(this.name, message);
  }

  receive(message: string): void {
    console.log(`${this.name} received the message: ${message}`);
  }
}

// 4. 创建具体中介者类
class ConcreteMediator implements Mediator {
  private colleagues: Colleague[] = [];

  register(colleague: Colleague): void {
    this.colleagues.push(colleague);
  }

  sendMessage(sender: string, message: string): void {
    this.colleagues.forEach(colleague => {
      if (colleague.name !== sender) {
        colleague.receive(message);
      }
    });
  }
}

// 使用示例
function main() {
  const mediator = new ConcreteMediator();

  const colleagueA = new ConcreteColleagueA("Colleague A", mediator);
  const colleagueB = new ConcreteColleagueB("Colleague B", mediator);

  mediator.register(colleagueA);
  mediator.register(colleagueB);

  colleagueA.send("Hello from A");
  colleagueB.send("Hello from B");
}

main();
  • 首先,我们定义了两个接口:Colleague 和 Mediator
    • Colleague 接口表示参与交互的对象,它有两个方法:send 用于发送消息,receive 用于接收消息
    • 并且有一个属性 mediator,指向中介者对象。Mediator 接口则定义了中介者应当具备的能力,包括注册同事对象(register)和转发消息(sendMessage)
  • 我们创建了两个实现了 Colleague 接口的具体同事类 ConcreteColleagueA 和 ConcreteColleagueB
    • 每个具体同事类都有自己的名字,并且持有中介者对象
    • 当它们想要发送消息时,通过调用中介者的 sendMessage 方法而非直接和其他同事类通信
  • 实现了 Mediator 接口的 ConcreteMediator 类是具体的中介者
    • 它维护了一个同事对象列表,并提供 register 方法用于同事对象的注册
    • 当一个同事对象通过 sendMessage 发送消息时,中介者会遍历同事列表,将消息转发给除了发送者之外的所有同事对象
  • 在 main 函数中,我们创建了一个 ConcreteMediator 对象作为中介者,并创建了两个同事对象(ConcreteColleagueA 和 ConcreteColleagueB)
    • 接着,我们把这两个同事对象注册到中介者,并让每个同事对象发送一条消息
    • 此时,消息通过中介者转发,确保每个同事都能收到除自己发送之外的消息
  • 通过这个示例,我们可以看到中介者模式是如何解耦同事对象之间直接的通信关系,转而通过中介者来进行消息传递,从而降低了耦合度,增强了系统的可维护性和扩展性

中介者模式应用场景

  • 对象间的交互复杂:当系统中有多个对象相互协作,且它们之间的交互关系错综复杂,表现为网状结构或多对多关系时,可以使用中介者模式来集中管理这些交互,将原来分散在各个对象之间的交互逻辑转移到中介者中,从而简化对象间的直接依赖关系

  • 需要解耦对象:当发现系统中对象彼此之间的依赖性过高,修改一个对象可能引起一系列连锁反应时,通过中介者模式可以使对象之间的耦合度降低,提高系统的可维护性和扩展性

  • 通信逻辑需要集中控制:在一些场景中,如网络聊天室、飞行控制系统、游戏引擎中的实体交互、UI组件间通信等,需要有一个中心对象来管理和协调不同对象间的通信,这些场景非常适合采用中介者模式

  • 易于扩展新功能:当系统中未来可能增加更多参与者(对象)或者改变交互规则时,通过中介者模式可以相对容易地调整和扩展通信逻辑,因为大部分交互都在中介者内完成,不涉及其他对象的改动

  • 需要支持模块化:在大型软件系统中,中介者模式可以帮助将系统划分为可独立开发和测试的模块,每个模块作为一个对象与中介者交互,而模块间的复杂交互则通过中介者来组织和协调

  • 总之,中介者模式尤其适用于那些对象间交互繁杂,且希望避免对象之间紧密耦合的场景,通过引入中介者,可以将复杂的交互关系转化为中介者与各个对象之间的简单交互

中介者模式优缺点


1 ) 优点

  • 降低对象之间的耦合度:同事对象之间不再直接相互调用,而是通过中介者来间接通信,减少了它们之间的耦合

  • 易于维护:由于将对象之间的交互逻辑集中到了中介者对象中,因此如果需要修改交互方式,只需修改中介者即可,而无需修改所有同事对象

  • 简化对象之间的通信:同事对象不再需要知道其他对象的存在,只需与中介者通信,降低了通信的复杂性

  • 支持灵活的通信方式:中介者可以根据需要实现不同的通信策略,比如广播、单播等

2 )缺点

  • 可能产生过多的中介者:如果系统中存在过多的中介者,可能会导致系统结构变得复杂

  • 中介者可能变得过于复杂:如果中介者需要处理大量的同事对象之间的交互,其内部逻辑可能会变得相当复杂,难以维护

  • 可能引入新的依赖:同事对象依赖于中介者,如果中介者出现问题,可能会影响到多个同事对象的正常工作

  • 在使用中介者模式时,需要根据具体场景和需求权衡其优缺点,确保在降低耦合度和简化通信的同时,避免引入过多的复杂性和依赖关系

中介者模式和代理模式区别和联系

  • 中介者模式(Mediator Pattern)和代理模式(Proxy Pattern)都是设计模式中的行为型模式,它们在解决软件设计问题上有不同的侧重点和应用场景

1 )中介者模式

  • 目的: 解决对象之间的多重关联和通信复杂性问题,通过引入中介者对象来封装对象间的交互逻辑,使得原本相互耦合的对象转变为与中介者对象的单向关联,从而降低对象之间的耦合度。

  • 角色: 同事类(Colleague)、中介者(Mediator)

  • 作用: 中介者对象集中处理同事类之间的交互,同事类只与中介者交互,不直接与其他同事类交互。

  • 适用场景: 多个对象之间存在复杂的网状交互,如聊天室的消息路由、组件间的通信协调等

2 )代理模式

  • 目的: 为其他对象提供一个代理,以控制对这个对象的访问,增强或扩展功能,如延迟加载、安全性控制、访问权限控制、远程代理、虚拟代理等。
  • 角色: 主题(Subject)、代理(Proxy)、真实主题(Real Subject)
  • 作用: 代理对象替代真实对象,对外提供相同的接口,但可以在调用前后附加额外的操作,比如缓存、预处理、后处理、权限检查等。
  • 适用场景: 需要控制访问、增强功能、保护目标对象或透明地添加额外操作等场合,如数据库连接池、图片懒加载、远程服务调用等。

3 )区别与联系

  • 区别
    • 目的不同:中介者模式主要用于解耦对象间的复杂交互,而代理模式主要用于控制对对象的访问
    • 结构不同:中介者模式中对象与中介者单向交互,代理模式中代理与真实对象的接口一致,代理对象代替或辅助真实对象工作
    • 作用不同:中介者模式改变了对象间的通信结构,代理模式通常不会改变对象间的结构,只是在访问过程中增加了额外的逻辑
  • 联系
    • 都属于行为型设计模式,都通过引入中间层对象来改善原有对象结构和行为
    • 都是对对象功能的一种包装和扩展,只不过中介者模式更关注于整体的交互协调,而代理模式更侧重于个体对象的访问控制和功能扩展
    • 在实际开发中,这两种模式经常结合使用,共同优化系统的架构和设计
c#代码介绍23种设计模式_18中介者模式 从生活中的例子可以看出,不论是QQ游戏还是QQ群,它们都是充当一个中间平台,QQ用户可以登录这个中间平台与其他QQ用户进行交流,如果没有这些中间平台,我们如果想与朋友进行聊天的话,可能就需要当面才可以了。电话、短信也同样是一个中间平台,有了这个中间平台,每个用户都不要直接依赖与其他用户,只需要依赖这个中间平台就可以了,一切操作都由中间平台去分发。了解完中介模式在生活中的模型后,下面给出中介模式的正式定义。中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系。 阅读详情

相关推荐

Java设计模式行为型模式(18)--- 中介者模式

又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。

shuai_h的博客 228

D18:C#设计模式之十七中介者模式(Mediator Pattern)【行为型】

一、引言 今天我们开始讲“行为型”设计模式的第五个模式,该模式是【中介者模式】,英文名称是:Mediator Pattern。还是老套路,先从名字上来看看。“中介者模式”我第一次看到这个名称,我的理解是,在两个对象中间增加一个“中间对象”,“中间对象”协调两个对象的关系,但是随着理解的深入,“中间对象”处理关系的对象可能不只是两个对象,可能是三个对象,或者更多对象。中介者模式在现实生活中的例...

. 442

C++设计模式17:中介者模式

中介者模式是一种行为型设计模式,它的目的是通过将对象之间的通信转移给中介者对象来减少对象之间的直接耦合,从而提高系统的可维护性和可扩展性。在中介者模式中,多个对象之间的通信不再直接进行,而是通过中介者对象进行协调。中介者对象通常包含一个接口,用于与其他对象进行通信,并能够根据接收到的消息来进行相应的处理。当对象需要与其他对象进行通信时,它们不再直接向目标对象发送消息,而是将消息发送给中介者对象,由中介者对象来协调处理。

琅嬛福地 999

设计模式第18讲——中介者模式(Mediator)

中介者模式是一种行为型设计模式,它主要用于减少对象之间互相通信的复杂性。一、什么是中介者模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景五、代码实现 5.0 UML类图 5.1抽象中介者(Mediator)——LogisticsCenter5.2抽象同事类(Colleague)——Participant5.3具体同事类(Concrete Colleague)TransportCompany&Merchant5.4具体中介者(Con

让~学习~成为一种习惯(橡 皮 人の技术博客) 3292

C#设计模式教程(18):中介者模式

中介者模式(Mediator Pattern)是一种行为设计模式,它允许一组对象相互通信,而不需要知道彼此的内部结构。这样做可以降低多个对象和类之间的通信复杂性,将多对多的通信转变为一对多的通信,使得对象之间的耦合松散,并且可以更容易地独立地改变和复用这些对象。Mediator:定义了一个接口,用于与各个Colleague(同事)对象通信。:实现Mediator接口并协调各个Colleague对象之间的交互。Colleague。

琅嬛福地 375

PCI Express 权威指南:从协议原理到芯片实现

目录 全文总览第一部分:PCIe体系结构概览第1章 互连技术的演进与PCIe的诞生1.1 从ISA到PCI:并行总线的辉煌与瓶颈1.2 PCI-X的尝试与局限1.3 串行革命:从AGP、PCI到PCIe的范式转移1.4 PCIe的核心优势第2章 PCIe系统全局视角2.1 系统拓扑:Root Complex, Switch, Endpoint的职能与关系2.2 拓扑结构实例:服务器、工作站、嵌入式系统2.3 枚举与配置:系统如何发现和组织PCIe设备2.4 地址空间第3章 PCIe协议分层架构3.1 分层模

qq_42882296的博客 2896

设计模式之中介者模式

中介者模式简介 提供一个中介对象出来,用于封装一系列对象的交互,从而使各对象不需要直接交互,进一步降低了对象间的耦合度。这是一种行为型设计模式。 由此可见,中介者模式主要解决的是对象间所存在的大量关系,我们都知道,对象间一旦关联紧密,必然会导致系统的复杂性增加,一旦某个对象有所修改,其关联对象也有可能会有跟着更改,这自然不是我们所希望的。有些朋友可能会说,如果交互很多,是不是可...

FK2015139136的博客 252

用MCP扩展Cursor的5种神奇用法:从文件操作到网页抓取实战

本文深入探讨了如何利用MCP(Model Context Protocol)扩展Cursor AI编程助手,解锁五种高效实用场景。从文件系统操作、网页内容抓取,到数据库查询、Figma设计稿对接,乃至构建自定义MCP服务器,文章通过实战案例展示了如何将Cursor从代码编辑器升级为能理解并操作工作环境的智能助手,显著提升开发效率与自动化水平。

weixin_29231027的博客 316

设计模式18-中介者模式

用一个中介对象来封装(封装变化)一系列的对象交互。终结者使各对象不需要显示的相互引用(编译时依赖变成运行时依赖),从而使其耦合松散也可以独立的改变他们之间的交互。–《设计模式》GOF中介者模式定义了一个中介对象,该对象封装了对象之间的交互方式,使得对象之间不再需要显式地相互引用,从而使其耦合松散,且可以独立地改变它们之间的交互。中介者模式通过引入中介者对象,将对象之间的交互逻辑集中管理,从而降低对象之间的耦合度。

qq_41810539的博客 934

原理图转PCB

本文讲述了原理图的编译、原理图转PCB的步骤和易错点。

m0_58083051的博客 3292

保姆级教程:用Qlib和LightGBM从零搭建你的第一个AI量化选股策略(附完整代码)

本文提供了一份详细的教程,教你如何使用Qlib和LightGBM从零搭建AI量化选股策略。教程涵盖了环境配置、数据获取、特征工程、模型训练和策略回测等关键步骤,并附有完整代码和常见问题解决方案,适合量化投资初学者快速上手。

weixin_29191081的博客 446

C++设计模式18——中介者模式

https://blog.youkuaiyun.com/CoderAldrich/article/details/83272866 C++设计模式——简单工厂模式 C++设计模式——工厂方法模式 C++设计模式——抽象工厂模式 C++设计模式——单例模式 C++设计模式——建造者模式 C++设计模式——原型模式 C++设计模式——适配器模式 C++设计模式——桥接模式 C++设计模式——组合...

chenyijun的专栏 544

Ubuntu22.04 apt 安装 ROS1 ROS Noetic Ninjemys

ubuntu 22.04 apt-get 安装 ros1 ros Noetic 最新版

autolabor的博客 5万+

C#设计模式之18——中介者模式

随着越来越多的类在程序中被开发出来,这些类之间的通信问题变得越来越复杂。每个类需要知道其他类的方法越多,类的结构就容易变得混乱,这使得程序不易于阅读和维护。另外,对程序的修改也变得困难起来,因为任何修改都会影响到其他多个类的代码。中介者模式通过促进这些类之间更加松散的耦合来解决这一问题。中介者实现这样一做法的方式是,成为唯一一个详细了解其他类的方法的类,其他的类在改变发生的时候通知中介者,中介者把

Work Hard, Play Harder! 3745

【RT-DETR涨点改进】全网独家首发、特征融合改进篇 | AAAI 2026 | 引入CDEM交叉动态增强模块,双向引导和融合,在低光图像增强中有效提升了图像的亮度,提升小目标和暗目标的检测准确率

本文提出了一种基于CDEM(交叉动态增强模块)改进的rtdetr网络模型,有效提升了在低光和复杂环境下的目标检测性能。CDEM模块通过动态增强亮度与色彩特征,改善图像输入质量,增强细节和对比度。该模块具有轻量级结构,易于集成到现有模型中,能够显著提升小目标和暗目标的检测准确率与鲁棒性。文章详细介绍了CDEM模块的结构原理、实现方法,并提供了完整的代码实现和配置指南,包括三种改进版本的YAML配置文件。实验结果表明,该方法在图像增强和目标检测任务中均取得了优异性能。

Ai缝合怪、助力小伙伴高效发论文 145

Python爬虫:如何抓取亚马逊商品评论和评分

通过本文的学习,您已经掌握了如何使用Selenium爬取亚马逊商品的评论数据,并处理反爬虫机制。特别是在亚马逊这样的大型电商平台,商品评论和评分不仅能够反映产品的质量和顾客的体验,还可以对商家进行竞争分析。通过爬取亚马逊的商品评论,您可以获得有价值的市场信息,如产品的优缺点、消费者的反馈等。通过查看源代码,您可以发现,亚马逊的商品评论和评分数据往往通过JavaScript动态加载,这也意味着在抓取时需要使用Selenium或Playwright等工具来模拟浏览器加载。亚马逊的评论页面支持分页加载。

2201_76125261的博客 1438

UE开发中的设计模式(二) —— 中介者模式

中介者模式也是一种行为型模式,用一个中介对象封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。Mediator: 抽象中介者ConcreteMediator: 具体中介者Colleague: 抽象同事类ConcreteColleague: 具体同事类可以看到两个同事之间没有依赖关系,都是通过中介者进行通信。

hhhcbw的博客,欢迎各位来访 1631

YOLOv8【第一章:基础入门篇·第1节】一文搞定,核心架构深度解析与环境配置!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 2106

设计模式18——行为型模式之中介者模式

定义:中介者模式(MediatorPattern),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 类型:对象行为型模式 概述:           面向对象编程,鼓励将行为分散到对象当中。这样的好处,增强对象的可复用性,但是带来的负面作用是,当多个对象交互时不可避免地会带来耦合性的大大提升。

飞鹤的程序员人生 1452

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

设计模式(18)——中介者模式

目录智能家庭项目传统方案解决智能家庭管理问题中介者模式中介者模式应用实例-智能家庭管理中介者模式的注意事项和细节 智能家庭项目 智能家庭项目 智能家庭包括各种设备、闹钟、咖啡机、电视机、窗帘 等 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起 -> 咖啡机开始做咖啡 -> 窗帘自动落下 -> 电视机开始播放 传统方案解决智能家庭管理...

minge0001的博客 605

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[设计模式笔记]快速小结(三)---行为型模式1

三. 行为行模式 14. Chain Of Responsibility(职责链模式) 意图: 使多个对象都有机会处理请求, 从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求, 直到有一个对象处理它为止. 结构: 图16 说明: 有多少开端, 就有多少条责任链. http://blog.youkuaiyun.com/bagboy_taob

cay22的专栏 1483

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

设计模式-18中介者模式(中介者设计模式)详解

用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。多个类相互耦合,形成了网状结构。将上述网状结构分离为星型结构。对象 Colleague 之间的通信封装到一个类中单独处理。1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。...

数字人生 211

设计模式(行为型)之中介者模式(Mediator Pattern)

看到这篇文章的人不知道有多少是和我一样的Android程序员。35岁,这是我们这个行业普遍的失业高发阶段,这种情况下如果还不提升自己的技能,进阶发展,我想,很可能就是本行业的职业生涯的终点了。我们要有危机意识,切莫等到一切都成定局时才开始追悔莫及。只要有规划的,有系统地学习,进阶提升自己并不难,给自己多充一点电,你才能走的更远。千里之行始于足下。这是上小学时,那种一元钱一个的日记本上每一页下面都印刷有的一句话,当时只觉得这句话很短,后来渐渐长大才慢慢明白这句话的真正的含义。

2401_84092809的博客 300

设计模式 18 中介者模式

一提到中介,大家都非常熟悉,生活中最常见的就是房屋中介。虽然中介要收取一定费用,但却能给房东和租客都提供大量遍历,房东只需要把房屋信息提供给中介,租客也只需要将租金交给中介,由中介处理中介环节,给两方都提供了便利。这就是中介模式的应用。

天河有尽后为涯,星海无边前作岸。 214

18、java设计模式--中介者模式

又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。

zht245648124的博客 975
上一篇: 设计模式: 行为型之命令模式(17)
下一篇: 设计模式: 行为型之中观察者模式(19)
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值