设计模式系列:适配器模式

Golang 设计模式系列4: 适配器模式(Adapter design pattern) 适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。 适配器模式包含如下角色: Target:目标抽象类 Adapter:适配器类 Adaptee:适配者类 Client:客户类 实现 Target:目标抽象类 type L... 阅读详情

简介

适配器模式(Adapter Pattern)又称为变压器模式,它是一种结构型设计模式。适配器模式的目的是将一个类的接口转换成客户端所期望的另一种接口,从而使原本因接口不匹配而不能一起工作的两个类能够一起工作。

适配器模式有两种形式:类适配器(Class Adapter)和对象适配器(Object Adapter)。类适配器通过继承实现适配器功能,让Adapter实现Target接口并且继承Adaptee,这样Adapter就具备Target和Adaptee的特性,可以将两者进行转化。对象适配器通过对象组合实现适配器功能,将一个对象组合到另一个对象中,以适配其接口。

结构

适配器模式(Adapter)包含以下主要角色:

  • 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  • 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

案例实现

类适配器

实现方式:定义一个适配器类来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件。

【例】读卡器

现有一台电脑只能读取SD卡,而要读取TF卡中的内容的话就需要使用到适配器模式。创建一个读卡器,将TF卡中的内容读取出来。

类图如下:

代码如下:

//SD卡的接口
public interface SDCard {
    //读取SD卡方法
    String readSD();
    //写入SD卡功能
    void writeSD(String msg);
}

//SD卡实现类
public class SDCardImpl implements SDCard {
    public String readSD() {
        String msg = "sd card read a msg :hello word SD";
        return msg;
    }

    public void writeSD(String msg) {
        System.out.println("sd card write msg : " + msg);
    }
}

//电脑类
public class Computer {

    public String readSD(SDCard sdCard) {
        if(sdCard == null) {
            throw new NullPointerException("sd card null");
        }
        return sdCard.readSD();
    }
}

//TF卡接口
public interface TFCard {
    //读取TF卡方法
    String readTF();
    //写入TF卡功能
    void writeTF(String msg);
}

//TF卡实现类
public class TFCardImpl implements TFCard {

    public String readTF() {
        String msg ="tf card read msg : hello word tf card";
        return msg;
    }

    public void writeTF(String msg) {
        System.out.println("tf card write a msg : " + msg);
    }
}

//定义适配器类(SD兼容TF)
public class SDAdapterTF extends TFCardImpl implements SDCard {

    public String readSD() {
        System.out.println("adapter read tf card ");
        return readTF();
    }

    public void writeSD(String msg) {
        System.out.println("adapter write tf card");
        writeTF(msg);
    }
}

//测试类
public class Client {
    public static void main(String[] args) {
        Computer computer = new Computer();
        SDCard sdCard = new SDCardImpl();
        System.out.println(computer.readSD(sdCard));

        System.out.println("------------");

        SDAdapterTF adapter = new SDAdapterTF();
        System.out.println(computer.readSD(adapter));
    }
}

类适配器模式违背了合成复用原则。类适配器是客户类有一个接口规范的情况下可用,反之不可用。

对象适配器模式

实现方式:对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中,该类同时实现当前系统的业务接口。

【例】读卡器

我们使用对象适配器模式将读卡器的案例进行改写。类图如下:

在这里插入图片描述

代码如下:

类适配器模式的代码,我们只需要修改适配器类(SDAdapterTF)和测试类。

//创建适配器对象(SD兼容TF)
public class SDAdapterTF  implements SDCard {

    private TFCard tfCard;

    public SDAdapterTF(TFCard tfCard) {
        this.tfCard = tfCard;
    }

    public String readSD() {
        System.out.println("adapter read tf card ");
        return tfCard.readTF();
    }

    public void writeSD(String msg) {
        System.out.println("adapter write tf card");
        tfCard.writeTF(msg);
    }
}

//测试类
public class Client {
    public static void main(String[] args) {
        Computer computer = new Computer();
        SDCard sdCard = new SDCardImpl();
        System.out.println(computer.readSD(sdCard));

        System.out.println("------------");

        TFCard tfCard = new TFCardImpl();
        SDAdapterTF adapter = new SDAdapterTF(tfCard);
        System.out.println(computer.readSD(adapter));
    }
}

注意:还有一个适配器模式是接口适配器模式。当不希望实现一个接口中所有的方法时,可以创建一个抽象类Adapter ,实现所有方法。而此时我们只需要继承该抽象类即可。

优缺点

适配器模式的优点包括:

  1. 扩展性:适配器模式可以用于将一个类的接口转换成客户端所期望的另一个接口,从而使得原本因接口不匹配而不能一起工作的两个类能够一起工作,这使得系统更加灵活和可扩展。
  2. 耦合度降低:通过适配器模式将不兼容的类进行适配,可以将原本耦合度较高的两个类解耦,降低系统的复杂性。
  3. 提高复用性:适配器模式可以将一个类的接口转换成客户端所期望的另一个接口,使得该类可以被更多的客户端使用,提高了代码的复用性。

然而,适配器模式也存在一些缺点:

  1. 增加中转层:适配器模式需要在原有系统基础上增加一个新的适配器层,这会增加系统的复杂性和额外的开销。
  2. 可能引入错误:由于适配器只是转换接口,而不修改原有类的实现,因此如果原有类的实现存在错误,适配器无法修正这些错误。
  3. 不易测试:由于适配器依赖于原有系统,因此对适配器的测试需要依赖于原有系统,增加了测试的难度。

应用场景

  • 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

源码中的应用

JDK

Java I/O 库
  • 在 Java I/O 库中,有很多适配器模式的应用。比如,InputStreamReader 和 OutputStreamWriter 类,它们将字节流适配为字符流,允许读写字符数据而不是字节数据。这些类就充当了适配器的角色,使得不同类型的流可以通过统一的接口进行操作。
Swing GUI 组件
  • 在 Swing GUI 编程中,也有一些适配器模式的应用。例如,WindowAdapter、MouseAdapter、KeyAdapter 等适配器类,它们实现了对应的监听器接口,但是提供了默认的空实现,使得开发者可以选择性地实现感兴趣的事件处理方法,而不必实现所有的方法。
Arrays 类
  • JDK 中的 Arrays 类提供了很多静态方法来操作数组,其中一些方法就是适配器模式的应用。例如,asList() 方法可以将数组适配为 List 接口的实现类,这样就可以通过 List 的方式来操作数组。
java.util.Collections 类
  • Collections 类中也有一些适配器模式的应用。例如,enumeration() 方法可以将 Enumeration 适配为 Iterator,使得旧的枚举类型可以通过 Iterator 的方式进行遍历。
JDBC(Java Database Connectivity)
  • 在 JDBC 中,ResultSet 对象提供了对数据库查询结果的操作。ResultSet 接口中有一系列的 getXXX() 方法用于获取不同类型的数据,这些方法就是适配器模式的应用,将数据库中的数据适配为 Java 中的基本数据类型。

Spring

Spring MVC 中的适配器
  • 在 Spring MVC 中,HandlerAdapter 充当了适配器的角色。它负责将不同类型的处理器(handler)适配为 HandlerInterceptor 或 HandlerExecutionChain,以便在请求处理流程中调用相应的处理器。
AOP(面向切面编程)中的适配器
  • Spring AOP 使用代理模式来实现切面(Aspect)的横切关注点。在这个过程中,适配器模式也发挥了作用。Spring AOP 通过适配器来将切面(Aspect)适配为通知(Advice),以便在目标方法调用前后或发生异常时执行相应的逻辑。
JDBC 中的适配器
  • 在 Spring 的 JDBC 模块中,JdbcAdapter 类提供了一组适配器方法,用于将不同的数据库厂商提供的 JDBC API 适配为 Spring JDBC 模板中的通用方法。这些适配器方法使得开发者可以以统一的方式访问不同数据库的数据。
消息队列中的适配器
  • 在 Spring Integration 框架中,适配器模式也被广泛应用。例如,MessageAdapter 用于将消息适配为 Spring Integration 中的消息类型,从而与 Spring Integration 的通道和端点进行交互。
测试模块中的适配器
  • 在 Spring Test 模块中,提供了一系列的适配器类,用于将不同的测试框架适配为 Spring Test 上下文中可用的测试类。例如,TestContextManager 适配了 JUnit 和 TestNG 测试框架,使得它们能够在 Spring 测试上下文中进行集成测试。

.Net Core

接口适配器
  • 接口适配器是指适配器类实现了一个接口,并将该接口的方法委托给另一个类的实例。在 .NET Core 中,这种模式常见于接口的默认实现。
  • 例如,在 .NET Core 中的 ASP.NET Core 框架中,IActionResult 接口定义了一种返回结果的标准,而 ActionResult 类则是这个接口的适配器,提供了接口方法的默认实现。
public interface IActionResult
{
    Task ExecuteResultAsync(ActionContext context);
}

public class ActionResult : IActionResult
{
    public virtual Task ExecuteResultAsync(ActionContext context)
    {
        // 提供了接口方法的默认实现
        return Task.CompletedTask;
    }
}
类适配器
  • 类适配器是指适配器类继承了另一个类,并实现了一个接口。在 .NET Core 中,类适配器常见于需要同时继承某个基类并实现某个接口的情况。
  • 例如,Entity Framework Core 中的数据库上下文(DbContext)就是一个类适配器,继承自 DbContextBase 并实现了 IDbContext 接口。
public class DbContext : DbContextBase, IDbContext
{
    // 实现接口方法
    public void SaveChanges()
    {
        // ...
    }
}
对象适配器
  • 对象适配器是指适配器类持有另一个类的实例,并实现一个接口。在 .NET Core 中,对象适配器常见于需要通过组合而非继承来实现适配的情况。
  • 例如,在 .NET Core 中的 HttpClient 类可以被视为一个对象适配器,它持有一个 HttpMessageHandler 实例,并实现了 IDisposable 接口。
public class HttpClient : IDisposable
{
    private readonly HttpMessageHandler _handler;

    public HttpClient(HttpMessageHandler handler)
    {
        _handler = handler;
    }

    // 实现接口方法
    public void Dispose()
    {
        _handler.Dispose();
    }
}
金融科技创新中人工智能的应用:8篇优质论文精选(含2023) 随着科技的飞速发展,金融领域正经历着前所未有的变革。在这个过程中,人工智能技术发挥着越来越重要的作用。为了深入探讨金融人工智能的研究和应用,享享特地整理了几篇金融人工智能方面的论文,大家可以看一下金融人工智能方向最新的研究成果!面向金融领域的大型语言模型本文介绍了BloombergGPT,一个基于广泛金融数据训练的500亿参数模型。基于彭博(Bloomberg)广泛数据来源,建立了一个基于彭博数据的3630亿令牌数据集,并结合了额外3450亿通用数据令牌。 阅读详情

相关推荐

Brim与ZUI协同安装指南:从下载到流量分析实战

本文提供Brim与ZUI协同安装与实战指南,详细讲解从下载、环境变量配置到流量分析的全流程。通过将PCAP文件转换为ZNG格式,结合直观的Zed查询语言,这套组合能极大提升大型网络数据包的分析效率,是网络安全与运维人员进行高效流量分析的利器。

metal的博客 458

适配器模式(Adapter Pattern)

一、定义 适配器模式(Adapter Pattern):结构型模式之一,将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。 二、UML类图 三、角色职责 目标角色(Target):该角色定义把其他类转换为何种接口,也就是我们的期望接口。 源角色(Adaptee):你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象。 适配器角色(Adapter):适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器

奶油芝士蘑菇汤的博客 2万+

大模型越狱指令数据集全解析:从AdvBench到HarmBench

本文全面解析了AdvBench、HarmBench等主流大模型越狱指令数据集。AdvBench作为基础测试集,用于快速评估模型安全基线;HarmBench则以其全面的文本、多模态及对抗性攻击评估,成为当前权威的深度安全审计工具。文章还介绍了MaliciousInstruct、JailbreakBench等特色数据集,并提供了根据实际场景选择与使用这些数据集的具体实战指南。

weixin_29327525的博客 616

设计模式第9讲——适配器模式(Adapter)

适配器模式是一种结构型设计模式,它允许将不兼容的对象转换成可兼容的接口。主要目的是解决在不改变现有代码的情况下,使不兼容的接口之间能够正常工作,通过创建一个中间转换的适配器来将一个对象转换成我们所需要的接口。当我们去国外旅游时,我们可能只会汉语,而当地人只会英语,那么这个时候就需要一个翻译员(翻译软件)来帮助我们。这就类似于适配器模式,通过一个适配器将一个不兼容的接口转成另外一个接口。下面以翻译为例,介绍一下类、接口、对象适配器。

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

model_optimizer将pi05端到端延时进一步优化到68.13ms了

目前在保持灵活性和性能之间找到一个较好的平衡。vit, llm仍然使用onnx->trt_engine的路径,量化可以通过https://github.com/NVIDIA/Model-Optimizer.git支持。同时支持通过cutedsl手写算子进行进一步优化denoise因为步数多,kernel launch多,因此完全通过手写融合算子实现,将所有steps进行一次大的cuda graph capture.

happyAnger6的专栏 57

利用 Python 构建高效爬虫爬取国家标准文献——从基础到进阶

然而,由于许多标准文献需要从特定网站获取,手动下载既耗时又低效,因此构建自动化爬虫成为一种实用且高效的解决方案。本文从技术选型、网站分析、代码实现到反爬优化,全面讲解了如何爬取国家标准文献。国家标准文献(National Standards Literature)是国家对各领域统一规范的文件,涵盖了技术参数、测试方法、生产工艺等内容。因此,通过自动化爬虫技术进行文献爬取和管理,不仅能解放劳动力,还可以提高数据管理效率。在构建爬虫前,我们需要对目标网站进行分析,包括页面结构、请求方式以及可能的反爬机制。

2201_76125261的博客 2104

设计模式之适配器模式详解

设计模式之适配器模式详解 文章目录设计模式之适配器模式详解一、什么是适配器模式二、适配器模式的角色组成三、适配器模式应用场景四、适配器模式--类适配器示例五、适配器模式--对象适配器示例六、适配器模式--接口适配器示例七、适配器模式优缺点 一、什么是适配器模式 适配器模式(Adapter Pattern) 也称为变压器模式 ,它的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作,属于结构型设计模式。适配器模式其实起着转化、委托的作用,将一种接

weixin_45538589的博客 4192

【开发必备插件】iframe嵌套报“拒绝连接请求”的本地解决方法

关键词:iframe 拒绝连接、X-Frame-Options、Chrome 插件、前端调试、Allow X-Frame-Options前几天我在本地项目里调试一个第三方网站的嵌入页面时,遇到了一个非常经典的报错:xxx.com 拒绝了我们的连接请求。熟悉的老前端们一眼就知道——这是。但对于日常开发来说,我们经常需要在本地测试 iframe 嵌套外部页面(比如嵌第三方登录页、支付页、可视化报表系统等)。而线上站点配置了或DENY时,就会直接导致 iframe 加载失败。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1540

设计模式-适配器模式(Adapter)

适配器模式(Adapter Pattern)是一种结构型设计模式,它主要用于解决两个不兼容的接口之间的问题。这种模式通过结合两个独立接口的功能,使原本不能一起工作的那些类可以一起工作。适配器模式涉及到一个单一的类,这个类负责将独立的或不兼容的接口功能整合到一起。举个例子,读卡器就是作为内存卡和笔记本之间的适配器。我们先把内存卡插入读卡器,再把读卡器插入笔记本,然后就可以通过笔记本来读取内存卡的内容了。

miaoyl的博客 5712

Linux安装MinIO(图文解说详细版)

最近开个新坑,就是在linux环境中操作开发环境,带大家玩转Linux,会整理出一篇Linux的专栏,欢迎大家订阅!! 富贵同学linux环境为CentOS7.8 版本。 上期跟大家说了一下OpenJDK的安装,这次说一下minio的安装 第一步,进入/opt 目录,创建minio文件夹 cd /opt mkdir minio 第二步,wget下载安装包: wget https://dl.minio.io/server/minio/release/linux-amd64/minio 第三步,进入m

编码人生 5万+

如何使用Github创建一个完全免费的个人网站

摘要: 本文详细介绍如何利用Github Pages免费搭建个人静态网站,适合零基础用户。首先需注册Github账号并创建特定命名的仓库(格式:用户名.github.io),然后通过网页或命令行创建index.html文件作为网站首页。完成后可通过"仓库设置- Pages"获取网站链接。文章还包含GitHub Desktop的安装使用、代码提交指南及常见问题自检方法,并说明即使Github被墙也可迁移至国内平台(如码云)。整个过程无需编程基础,仅需15分钟即可完成基础网站搭建。

安德洛夫 1514

23种设计模式:适配器模式(最强解析!!!)

适配器模式是23种设计模式之一。 适配器模式作用 适配器模式的作用,在于将一个类的接口变换为客户端所期待的另一种接口,使得原本因为接口不匹配而无法一起工作的两个类能在一起工作。 也就是说,适配器模式解决的是接口兼容性问题。 适配器模式实现方式 适配器模式依据实现方式的不同,可以划分为3种:类适配器、对象适配器和接口适配器。 (一)类适配器 类适配器类图如下: 类适配器主要由三部分构成: Target:目标角色,也即被转换后的接口; Adaptee:源角色,需要被转换的接口; Ad.

进击的Coder*的博客 4715

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【图解设计模式系列】The Adapter Pattern: 适配器模式

适配器模式是将一个类的接口转换成客户希望的另一个接口,从而让那些接口不兼容的类可以一起工作。 converts the interface of a class into another interface the clients expect. Adapter lets classes works together that couldn’t otherwise because of incompatible interfaces. 适配器模式包含一下三个角色: Target(目标抽象类):目标抽象

Tech in Pieces 611

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C#设计模式系列:适配器模式(Adapter Pattern)

一、引言 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用。但是新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?Adapter 模式为我们很好的解决这类问题。 1.1 、定义 适配器模式--把一个类的接口转换成客户端所期待的另一个接口,从而使原本接口不匹配而无...

weixin_34242509的博客 195

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

4.结构型设计模式 - 第1回:引言与适配器模式 (Adapter Pattern) ——设计模式入门系列

适配器模式(Adapter Pattern)将一个类的接口转换为客户期望的另一个接口,使得原本接口不兼容的类可以一起工作。它常用于解决“现有接口”与“需要的接口”之间的不兼容问题。

开源AI 专属 UI——papyrai-ui。《千界明彻录》(故事形式构建元思维)——胡说小说。更多思辨内容在公众号。 1309

极速理解设计模式系列:6.适配器模式(Adapter Pattern)

四个角色:目标抽象类角色(Target)、目标对象角色(Adapter)、源对象角色(Adaptee)、客户端角色(Client) 目标抽象类角色(Target):定义需要实现的目标接口 目标对象角色(Adapter):调用另外一个源对象,并且转换(适配)为需要的目标对象。 源对象角色(Adaptee):因...

weixin_34379433的博客 84

硬肝系列:23种设计模式之适配器模式

用示例代码来帮你了解适配器模式 对于“设计模式”这个词大家肯定都不陌生,很多框架也用到了设计模式,但是大部分的开发者应该是没有深入的了解过,我准备硬肝下这23设计模式作为专题文章的开端,一共23种设计模式,我尽量在<23天肝完。 为什么要学习设计模式:https://blog.youkuaiyun.com/kaituozhe_sh/article/details/107922339 在我大学四年,对设计模式也没有什么概念,写代码就想着能实现就可以了,不会有设计模式那样的思想,但是当学习到了框架的时候,对于设计模式

ALiangXLogic的博客 337

JavaScript设计模式系列五:适配器模式

什么是适配器模式 所谓 适配器模式 就是用一个新的接口对现有的接口进行包装,处理类与API的不匹配。使用这种模式的对象又叫作包装器。 比如我们有一个接口: function api (x1, x2, x3) { console.log(x1 + x2 + x3); // 用console.log来模拟接口的相关操作 } 然后我们有一个对象数据: var obj = {

Holzpp的博客 669

设计模式系列之八:适配器模式

前言适配器模式与外观模式一样,也属于结构型模式。适配器所谓适配就是定义了一个外界希望的接口,从而使得原来不能工作的那些对象可以一起工作。在软件开发中,如果希望复用一些类,但是需要复用的类与复用环境不符的时候,需要使用适配器模式。更具体的说就是当前系统的行为与数据都正确但是接口不符这样就需要使用适配器模式。从设计角度讲,适配器模式耐无奈之举。这么说也很好理解,因为当需要复用一些类的时候,如果不希望更改

rhwayfun专栏 901

设计模式系列之五:适配器模式

适配器模式属于结构型设计模式,主要应用于升级或改造旧系统时。所谓适配器按生活中的说法就是一个转接口,将原本不直接匹配的两个产品组合起来,类似于用iPhone手机充电器给android手机充电需要一个转换头,生活中这种例子随处可见。 适配器模式主要有三个组成部分,目标接口(Target),适配器(Adapter),适配对象(Adaptee)。 package com.panda.adpter;

Eric_ley的博客 550

设计模式系列:搞懂适配器模式,实现接口间不同的变换

适配器模式的定义:将一个类的接口转换成客户端需要的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。属于结构型设计模式。 适配器模式分为类适配器、对象适配器和接口适配器。 适配器模式的结构:适配器模式(Adapter)包含3个主要角色。 目标(Target)角色:系统业务所期待的接口,它可以是抽象类或接口。 适配者(Adaptee)角色:等待被适配的对象。 适配器(Adapter)类:它是一个转换器,把适配者角色转换成目标角色。

风雨编码路的博客 1959
上一篇: 设计模式系列:责任链模式
下一篇: Java 设计模式系列:建造者模式
Code技术分享
博客等级 码龄7年 3327粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值