设计模式介绍:依赖注入代码示例

C# 依赖注入:一种提高代码质量的设计模式 阅读详情
设计模式介绍:依赖注入代码示例

依赖注入是一种非常常见和有用的设计模式。让我们深入研究一下,看看它为什么如此有用,又怎么用。

依赖项注入是一种使类独立于其依赖项的编程技术。它可以将对象的创建与使用进行分离。这有助于您遵循SOLID的依赖倒置和单一责任原则。

正如我之前在关于可靠设计原则的文章中所解释的,它们的目标是提高代码的可重用性。还可以减少需要更改类的频率。依赖注入可以通过分离对象的创建和使用。这使您能够在不更改使用它们的类的情况下替换依赖类。当类的依赖项发生变化时,我们不必再承担更改类代码的风险。

依赖注入技术是 service locator pattern服务定位器模式的一种流行的替代方法。许多现代应用程序框架都实现了它。这些框架提供了技术的技术部分,这样您就可以专注于业务逻辑的实现。

常见的例子:

  • 对Java (CDI)规范中的Jakarta EE上下文和依赖注入的引用实现。
  • Spring
  • Guice
  • Play framework
  • Dagger
设计模式介绍:依赖注入代码示例

依赖注入技术

您可以引入接口来打破高级和低级类之间的依赖关系。如果这样做,两个类都依赖于接口,而不再依赖于彼此。我在我的文章中非常详细地解释了依赖倒置原则。

该原则提高了代码的可重用性,并限制了需要更改低级类时的连锁反应。但是即使您完美地实现了它,您仍然保持对底层类的依赖。该接口只是将低级类的使用分离,而不是它的实例化。在代码中的某个地方,您需要实例化接口的实现。这将防止您用另一个接口替换接口的实现。

依赖注入技术的目标是通过将使用与创建对象分离来删除这种依赖关系。这减少了所需的样板代码的数量,并提高了灵活性。

但是在我们看一个示例之前,我想告诉您更多关于依赖注入技术的内容。

依赖注入中的4个角色

如果您想使用这种技术,您需要实现四个基本角色的类。

这些都是:

  • 您想要使用的服务。
  • 使用服务的客户端。
  • 由客户端使用并由服务实现的接口。
  • 注入器创建服务实例并将其注入到客户端。

通过遵循依赖倒置原则,您已经实现了这四个角色中的三个。服务和客户端是依赖倒置原则通过引入接口来删除依赖项的两个类。

您可以跳过接口角色,直接将服务对象注入客户机。但是通过这样做,您就打破了依赖倒置原则,您的客户端对服务类具有显式的依赖关系。在某些情况下,这可能没问题。但最常见的情况是,最好引入一个接口来删除客户端和服务实现之间的依赖关系。

注入器本身是唯一不需要实现依赖倒置的角色。但这不是问题,因为您不需要实现它。本文开头列出的所有框架都提供了它的现成实现。

如您所见,依赖注入非常适合遵循依赖倒置原则的应用程序。您已经实现了所需的大部分角色,依赖项注入技术使您能够消除服务实现的依赖项。

使用依赖注入使CoffeeApp更加灵活

我在我的文章中使用了CoffeeApp示例,它是关于依赖倒置原则的。让我们更改它,以便它使用依赖注入技术。

这个小应用程序允许您控制不同的咖啡机,您可以使用它来煮一杯新鲜的过滤咖啡。它由一个咖啡应用类组成,该类在CoffeeMachine界面上调用brewFilterCoffee方法来煮一杯新鲜的咖啡。类BasicCoffeeMachine实现CoffeeMachine接口。

设计模式介绍:依赖注入代码示例

正如您在图中看到的,这个应用程序已经遵循依赖倒置原则。它还提供依赖倒置技术所需的四种角色中的三种:

CoffeeApp实现客户端角色。

BasicCoffeeMachine类充当服务。

CoffeeMachine接口实现了接口角色。

唯一缺少的就是注入器。我将通过使用Weld框架介绍该角色的实现。它是Jakarta EE的CDI规范的参考实现。自2.0版本以来,您可以在Java SE环境中直接使用它,而无需添加庞大的框架堆栈。

CDI 2.0是所有Jakarta EE 8应用服务器的一部分。如果将应用程序部署到这样的服务器,则不再需要CDI容器。

如果您使用的是不同的应用程序框架,例如Spring,您应该使用该框架提供的依赖注入实现。它使您能够使用我在下面示例中展示给您的相同概念。

Bootstrapping CDI

在使用CDI的依赖项注入特性之前,需要bootstrapping CDI容器。不过别担心,Weld把它做得非常简单。它提供了一个内建的主方法,为您bootstrapping一个容器。

您可以执行以下命令来运行它。

java org.jboss.weld.environment.se.StartMain

但是,在没有应用程序的情况下bootstrapping CDI容器并没有多大意义。您可以在两个步骤中添加应用程序,

几乎不需要任何代码。

Weld-SE Dependency

您需要向应用程序添加对weld-se的依赖项。

<dependency> <groupId>org.jboss.weld.se</groupId> <artifactId>weld-se-core</artifactId> <version>3.0.4.Final</version></dependency>

编写并运行CoffeeAppStart类

下一步是在CDI容器中运行应用程序所需的惟一实现任务。您需要编写一个方法来观察ContainerInitializedevent。我在CoffeeAppStarter课堂上做的。类似于我的文章中关于依赖倒置原则和服务定位器模式的示例,这个类启动CoffeeApp。

@Singleton
public class CoffeeAppStarter {
 private CoffeeApp app; 
@Inject 
public CoffeeAppStarter(CoffeeApp app) 
{ this.app = app; 
} 
public void startCoffeeMachine(@Observes ContainerInitialized event) { 
try { 
app.prepareCoffee(CoffeeSelection.FILTER_COFFEE); 
} catch (CoffeeException e)
 { e.printStackTrace(); }
 }}

在CDI中观察事件是简单而有力的。您只需要用一个方法参数上添加@ observer注解。一旦带注解的参数的类型触发事件时,容器将调用此方法。Weld在启动CDI容器之后触发容器初始化事件。因此,这个方法将在应用程序启动时调用。

使用CDI的依赖注入

您可能已经在前面的代码片段中识别了@Inject注解。它告诉CDI容器在调用CoffeeAppStarter类的构造函数时注入CoffeeApp对象。因此,您可以使用startCoffeeMachine方法中的CoffeeApp应用属性来煮一杯过滤咖啡。

这种方法显然不遵循依赖倒置原则,因为缺少接口。但我认为这是可以接受直接注入服务实现的罕见情况之一。CoffeeAppStarter类的惟一任务是通过调用注入的CoffeeApp对象上的prepareCoffeemethod来启动咖啡机。我认为没有必要添加另一个抽象来使CoffeeApp可替换。

但是coffeeMachine属性在CoffeeApp类中并不存在这种情况。将来,这个应用程序将需要控制不同类型的咖啡机。我想让替换它们变得尽可能简单。这就是为什么我在以前的文章中介绍了CoffeeMachine接口。正如您在以下代码片段中看到的,CoffeeApp类仅依赖于CoffeeMachine接口。它不依赖于任何接口实现。

public class CoffeeApp { 
private CoffeeMachine coffeeMachine;
 @Inject 
public CoffeeApp(CoffeeMachine coffeeMachine) { 
this.coffeeMachine = coffeeMachine; 
} 
public Coffee prepareCoffee(CoffeeSelection selection) throws CoffeeException { 
Coffee coffee = this.coffeeMachine.brewFilterCoffee(); 
System.out.println("Coffee is ready!"); 
return coffee; }
}

在前面的文章中,CoffeeAppStarter类必须实例化CoffeeMachine接口的特定实现。它在实例化CoffeeApp对象时将该对象作为构造函数参数提供。

构造函数注入现在允许您将编译时对特定实现类的依赖项替换为对任何实现类的运行时依赖项。这使得替换CoffeeMachine实现非常容易。您只需要在启动应用程序时将CoffeeMachine接口的不同实现添加到您的类路径中。

总结

SOLID的依赖倒置原则引入了高层次类与其依赖项之间的接口。它将高级类与它的依赖关系分离开来,这样您就可以在不改变使用它的代码的情况下更改低级类的代码。唯一直接使用依赖项的代码是实例化实现接口的特定类的对象的代码。

依赖注入技术使您能够进一步改进这一点。它提供了一种将对象的创建与使用分离的方法。通过这样做,您可以在不更改任何代码的情况下替换依赖项,而且还可以减少业务逻辑中的重复的样板代码。

Golang:依赖注入与wire 依赖注入(dependency injection,缩写DI)是一种软件设计模型,用于实现类之间的解耦和依赖关系的管理。它通过将依赖关系的创建和维护责任转移到外部容器中,使得类不需要自己实例化依赖对象,而是由外部容器动态地注入依赖。依赖注入的实现方式包括构造函数注入、属性注入、接口注入等,每种方式都有其特定的用途和优势。修改后代码,我们把db的初始化放到了NewService的外面,在调用NewService的时候将其通过传参的方式传递过来。在Golang只使用依赖注入的核心目的,其实就是为了解耦代码。 阅读详情

相关推荐

依赖注入模式(附C++代码示例)

依赖注入模式(附C++代码示例)

Warren++的博客 920

设计模式之依赖注入模式

依赖注入是一种软件设计模式,其中一个或多个依赖项(或服务)被注入或通过引用传递到一个依赖对象(或客户端)中,并成为客户端状态的一部分。该模式将客户的依赖关系的创建与其自身的行为分开,这使程序设计可以松散耦合,并遵循控制反转和单一职责原则。

DSDS454651的博客 1655

如何让 RTX 5090 开启 PCIE P2P 以加速多卡通信

RTX 5090 基于新的 Blackwell 架构。NVIDIA 出于对某些主板兼容性(如 IOMMU、Resizable BAR 策略)的保守考虑,**屏蔽了 5090 的 BAR1 P2P 功能**。 我们需要通过 Patch 驱动源码,强制开启这一隐藏功能。 开启 P2P 后,PyTorch 的集合通信算子(Multi-GPU 训练的核心)延迟显著降低,**All-Reduce 甚至降低了 60% 以上**。

Hi20240217的博客 1725

游戏开发中的依赖注入实战解析

message} }依赖注入是一种强大的设计模式,可以显著提高代码的可依赖注入是一种强大的设计模式,可以显著提高代码的可维护性、可测试性和灵活性。通过依赖注入,我们可以轻松地管理对象之间的依赖关系,并在运行时动态地替换这些依赖对象。下面我们继续深入探讨依赖注入的更多细节和高级用法。void Use();");");amount");} }

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1350

基于因果推理的LLM去毒:精准定位注意力头实现高效干预

在大型语言模型(LLM)的部署与应用中,模型安全与可控性是核心挑战之一。传统方法如全参数微调成本高昂,且可能损害模型通用能力。本文聚焦于一种基于因果推理的精准干预技术,其原理在于利用因果发现算法定位Transformer模型中与“毒性”输出存在强因果关联的特定注意力头。该技术通过分析注意力头的激活模式与生成文本毒性分数之间的因果关系,识别出关键责任单元,而非依赖传统的相关性分析。其技术价值在于实现了轻量级、高可解释性的模型行为修正,能以极低的参数改动代价有效降低模型在敏感话题上的有害输出。在应用场景上,该方

weixin_32667439的博客 312

浏览器Cookie迁移实战:从Chrome导出导入登录态全攻略

Cookie是浏览器保存的会话凭证,服务端通过Set-Cookie将登录态种在本地。迁移Cookie本质上是把服务端认可的会话标识搬到新环境,从而免去重复输入账号密码和二次验证的麻烦。在换电脑、切浏览器或重装系统时,掌握Cookie的导出导入技术能显著提升效率。Chrome与Edge同属Chromium内核,存储结构相似,但字段差异(如Domain、SameSite、Secure)常导致迁移失败。通过浏览器扩展或CDP脚本可实现跨浏览器登录态迁移,适用于内网后台、开发环境等场景。本文从原理到实践,梳理Coo

weixin_42533120的博客 339

Spring 依赖注入示例

Spring依赖注入(Dependency Injection,DI)和控制反转含义相同,它们是从两个角度描述的同一个概念。使用依赖注入可以更轻松的管理和测试应用程序。 当某个 Java 实例需要另一个 Java 实例时,传统的方法是由调用者创建被调用者的实例(例如,使用 new 关键字获得被调用者实例),而使用 Spring 框架后,被调用者的实例不再由调用者创建,而是由 Spring 容器创建,这称为控制反转。 Spring 容器在创建被调用者的实例时,会自动将调用者需要的对象实例注入给调用者,调用者.

swadian2008的博客 881

6.4 构网型储能的需求与配置

摘要: 构网型储能是新型电力系统的关键支撑技术,通过提供电压/频率形成、惯性和稳定控制能力,解决同步机退出导致的系统稳定性问题。其配置需遵循三大原则:1)容量配置以支撑需求为主导,兼顾能量服务;2)优先布局于电网薄弱点、稳定问题突出区域;3)采用自适应控制策略实现全工况优化。核心应用场景包括新能源送出通道稳定、负荷中心调频、黑启动电源等。规划方法需结合系统分析、量化指标和成本效益评估,实现技术经济最优。未来需重点关注构网/跟网混合系统的临界容量占比及自适应控制技术发展。

技术工作者 1140

依赖注入的实现方法(步骤截图,完整代码)

spring依赖注入的实现方法(步骤截图,完整代码) 创建setter()的方法 配置文件中编写bean实例以及用property注入userDao实例

qq_48457459的博客 2692

学Simulink--基于多能源系统协同与能源互联网的电网系统场景实例:风光氢储一体化系统的能量管理与调度仿真

在全球“双碳”目标驱动下,高比例可再生能源并网成为电网发展的核心方向。然而,风电与光伏具有强随机性与间歇性,给电网稳定运行带来巨大挑战。风光氢储一体化系统(Wind-Solar-Hydrogen-Storage Integrated System)通过将可再生能源发电电解水制氢氢气储存与燃料电池发电有机结合,构建了一个长时储能与能量形态转换的闭环系统,是实现能源互联网与零碳电力系统的关键路径。✅平抑波动:氢储能可实现跨天、跨周储能✅能量转化:电→氢→电/热/交通燃料,实现多能互补✅长时储能。

amy_mhd的博客 1071

windows10下 iperf3测试带宽

客户端输入:"iperf3.exe -u -c 服务器IP地址 -b 5g" //客户端给服务器发送udp数据包,最大带宽为5g。客户端输入:“iperf3.exe -c 服务器IP地址 -P 10“//表示客户端10路并行给服务器发送TCP包;上图可知:带宽是15Gbps(这里不知道为什么下面测试的UDP会比这里TCP慢 按道理UDP不可能比TCP慢的5.)3. 验证是否下载成功,在打开的窗口中输入“iperf3.exe -v”,会出现安装的版本,表示安装成功了。5. iperf3参数。

xiaoqixiaoguai的博客 5890

Spring源码之依赖注入

依赖注入(Dependency Injection,简称DI)是控制反转(Inversion of Control,简称IoC)一种具体实现技术,作为Spring核心功能,解耦了对象的创建与使用,即我们可以不用显示的创建对象的依赖,而是通过外部容器在运行时完成对象的注入。注入点为@Autowired、@Resource、@Inject、@Value注解标记的属性、方法,通过反射的方式进行值注入。

qq_26783889的博客 1019

Python爬虫教程:微博热点话题抓取与社交媒体分析

微博是中国最大的社交媒体平台之一,拥有海量的用户和丰富的讨论话题。通过爬取微博的热门话题和讨论内容,我们可以深入分析用户的兴趣、舆论走势、社会情绪等。通过爬取微博的热点话题和讨论内容,我们可以获得关于当前热门话题的宝贵数据,并基于这些数据进行多种社交媒体分析。本文将通过Python爬虫技术,详细介绍如何抓取微博上的热门话题、话题讨论内容,并进行社交媒体分析。希望本文为你提供了一个全面的微博数据抓取与分析的指南,帮助你在社交媒体数据分析的道路上迈出坚实的第一步。微博上的一些页面内容是静态的,可以直接通过。

2201_76125261的博客 590

Spring依赖注入(DI)

在Spring框架中,依赖注入(DI)的设计模式是用来定义对象彼此间的依赖。它主要有两种类型: Setter方法注入 构造器注入 1. Setter方法注入 这是最流行最简单的DI注入方法,通过设置方法注入依赖。 示例 帮助器类和指定的setter方法 package com.yiibai.output; import com.yiibai.output.I

Wit_tang的博客 382

手把手教你学Simulink——基于Simulink的机械臂正运动学仿真建模示例

机械臂正运动学概述正运动学的核心在于根据每个关节的角度值,通过坐标变换(如DH参数法或齐次变换矩阵)计算出末端执行器相对于基座的位置和姿态。常用的数学工具包括旋转矩阵、平移向量以及它们组合而成的齐次变换矩阵。仿真目标设计并实现一个机械臂正运动学模型。输入关节角度,输出末端执行器的位置和姿态。分析不同关节角度下的机械臂位置变化。假设我们有一个简单的3自由度(DOF)平面机械臂,其各关节的长度分别为l1l1​、l2l2​和l3l3​。在Simulink中,可以使用。

MHD0815的博客 359

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...

angularJS之四大特性

         最近学习angularJS,大致将angulaJS的四大特性了解一遍,学习之余希望通过总结来帮自己加固一下对知识的理解,如果有错误或者有其他观点,希望大家指正!!           angularJS的设计思想是以数据为核心的,对DOM操作进行的底层的封装,所以我们在进行编码时基本用不到DOM操作,和常见的jQuery以及bootstrap大不相同。angular JS中有许...

小望没烦恼的博客 876

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

DesignPatternsPHP:2024终极PHP设计模式实战指南——从入门到精通

DesignPatternsPHP是一个专注于PHP 8.x设计模式实现的开源项目,提供了丰富的设计模式示例代码,帮助开发者理解和应用各种设计模式解决实际问题。无论你是PHP初学者还是有经验的开发者,这个项目都能为你提供清晰的设计模式实践指导。 ## 📚 为什么设计模式对PHP开发至关重要? 设计模式是软件开发中的最佳实践总结,它们提供了经过验证的解决方案来应对常见的编程挑战。在PHP开发中

gitblog_01144的博客 670

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

Spring中依赖注入和工厂模式的区别介绍、示例代码

在Spring框架中,依赖注入(Dependency Injection, DI)和工厂模式(Factory Pattern)是两种不同的设计模式,它们解决的问题和使用方式也有所不同。以下是对这两种模式的详细描述以及示例代码。

a_beiyo的博客 679

掌握 C# 设计模式:从基础到依赖注入

设计模式是一种可以在开发中重复使用的解决方案,能够提高代码的可维护性、扩展性和复用性。C# 中常见的设计模式包括单例模式、工厂模式、观察者模式、策略模式等。本文将介绍这些常见的设计模式,并探讨 SOLID 原则和依赖注入(Dependency Injection)的重要性。

qq_45728381的博客 2040

设计模式-依赖注入模式

依赖注入(Dependency Injection,简称DI)是一种面向对象编程中的设计模式,它的目的是将一个对象所依赖的其他对象的创建过程从该对象本身中分离出来,以便更好地实现解耦和可测试性。在DI模式中,对象不是通过自己创建所需要的依赖对象,而是通过构造函数、属性或接口传递进来。构造函数注入(Constructor Injection):依赖对象通过被依赖对象的构造函数传入。这种方式是DI的主要方式,也是最简单的一种方式。它可以保证依赖对象的创建和注入是在同一时间完成的,因此可以确保依赖对象的可用性。

技术人集结地 4000

设计模式:依赖注入

尽管依赖注入是一个很少为初学者讲授的话题,但它是一种值得更多关注的设计模式。 许多开发人员避免依赖注入,因为他们不知道它意味着什么,或者因为他们认为自己不需要它。 在本文中,我将尝试说服依赖注入的价值。 为此,我将以最简单的形式向您介绍依赖注入的简单性。 1.什么是依赖注入? 关于依赖关系注入的文章很多,有许多旨在简化依赖关系注入的工具和库。 然而,有一句话引述了许多人对依赖注入的...

Web design 教程小屋 523

Java依赖注入 - DI设计模式示例教程

  Java依赖注入 - DI设计模式示例教程   Java依赖注入 设计模式允许我们删除硬编码的依赖项,并使我们的应用程序松散耦合,可扩展和可维护。我们可以在java中实现依赖注入,以将依赖项解析从编译时移动到运行时。 目录[ 隐藏 ] 1 Java依赖注入 1.1 Java依赖注入 - 服务组件 1.2 Java依赖注入 - 服务消费者 1.3 Java依赖注入 - 注入...

YunWisdom 1285

C++中的依赖注入

依赖注入框架是一种强大的软件设计模式实现工具,它能够帮助开发者降低代码的耦合度,提高代码的可测试性、可维护性和可扩展性。通过外部配置或代码逻辑将依赖项注入到目标对象中,依赖注入框架使得对象的创建、配置和生命周期管理变得更加灵活和高效。

红军不怕远征难,万水千山只等闲 3351

Python 讲解设计模式依赖注入

依赖注入(Dependency Injection, DI)是一种设计模式,它允许将一个对象的依赖关系从外部提供给该对象,而不是由对象自己创建这些依赖。通过这种方式,可以实现代码的松耦合、可测试性和灵活性。

软件架构师笔记 1370

golang中关于依赖注入的几种使用方式(概念与代码示例)

本文介绍了Go语言中依赖注入(DI)的四种实现方式。构造函数注入是最推荐的方式,强制明确依赖关系;接口注入通过方法注入依赖;属性注入直接赋值依赖字段;DI容器框架如Google Wire可自动生成依赖代码。文章通过代码示例详细说明每种方式的用法,并对比了它们的优缺点。最后解答了两个常见问题:指针传递与值传递的区别,以及Wire框架对接口绑定的支持情况。依赖注入有助于解耦代码、提高可测试性和可维护性,在Go项目中可根据需求选择合适的方式实现。

bojinyuan00的博客 1463

设计模式:依赖注入,为什么使用依赖注入,依赖注入带来的代码结构的改变和优点

"""抽象基类强制继承类实现"""pass通过依赖注入,变得更加灵活、可测试和易于维护。它遵循了面向对象设计的最佳实践,如松耦合、单一职责原则和依赖倒置原则。这些优点使得依赖注入成为一种推荐的设计模式,特别是在需要高可维护性和可扩展性的项目中。

404_notfond 1062
上一篇: DevOps爱好者必须阅读的微服务架构7本书
下一篇: 理解CSharp 语言中相等Equality 和唯一 Identity
codinghello
博客等级 码龄25年 47粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值