装饰模式【Decorator Pattern】

一文告诉你:如何在trae中编译运行GD32程序,并让AI帮你修改代码 本文详细介绍了如何将GD32程序如何用官方固件库构建出来,然后从Keil迁移到国产免费工具Trae,并利用AI进行代码修改的全过程。 阅读详情

        Ladies and gentlemen,May I get your attention,Please?,Now I’m going to talk about decoratorpattern.装饰模式在中国使用的那实在是多,中国的文化是中庸文化,说话或做事情都不能太直接,需要有技巧的,比如说话吧,你要批评一个人,你不能一上来就说你这个做的不对,那个做的不对,你要先肯定他的成绩,表扬一下优点,然后再指出瑕疵,指出错误的地方,最后再来个激励,你修改了这些缺点后有那些好处,比如你能带更多的小兵,到个小头目等等,否则你一上来就是一顿批评,你瞅瞅看,肯定是不服气,顶撞甚至是直接“此处不养爷,自有养爷处”开溜哇。这是说话,那做事情也有很多,在山寨产品流行之前,假货很是比较盛行的,我在 2002 年买了个手机,当时老板吹的是天花乱坠,承诺这个手机是最新的,我看着也像,壳子是崭新的,包装是崭新的,没有任何瑕疵,就是比正品便宜了一大截,然后我买了,缺钱哪,用来 3 个月,坏了,一送修,检查,说这是个新壳装旧机,我晕!拿一个旧手机的线路板,找个新的外壳、屏幕、包装就成了新手机,装饰模式害人不浅呀!

        我们不说不开心的事情,今天举一个什么例子呢?就说说我上小学的的糗事吧。我上小学的时候学习成绩非常的差,班级上 40 多个同学,我基本上都是在排名 45 名以后,按照老师给我的定义就是“不是读书的料”,但是我老爸管的很严格,明知道我不是这块料,还是往赶鸭子上架,每次考试完毕我都是战战兢兢的,“竹笋炒肉”是肯定少不了的,能少点就少点吧,肉可是自己的呀。四年级期末考试考完,学校出来个很损的招儿(这招儿现在很流行的),打印出成绩单,要家长签字,然后才能上五年级,我那个恐惧呀,不过也就是几秒钟的时间,玩起来什么都忘记了。

      我们先看看这个成绩单的类图:


成绩单的抽象类,然后有一个四年级的成绩单实现类,先看抽象类:

package com.cbf4life;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 成绩单的抽象类
*/
public abstract class SchoolReport {
//成绩单的主要展示的就是你的成绩情况
public abstract void report();

//成绩单要家长签字,这个是最要命的
public abstract void sign();
}

然后看我们的实现类 FouthGradSchoolReport:
package com.cbf4life;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 四年级的成绩单,这个是我们学校第一次实施,以前没有干过
* 这种“缺德”事。
*/
public class FouthGradeSchoolReport extends SchoolReport {
//我的成绩单
public void report() {
 //成绩单的格式是这个样子的
 System.out.println("尊敬的XXX家长:");
 System.out.println(" ......");
 System.out.println(" 语文 62 数学65 体育 98 自然 63");
 System.out.println(" .......");
 System.out.println(" 家长签名: ");
 }
//家长签名
public void sign(String name) {
 System.out.println("家长签名为:"+name);
 }
} 
成绩单出来,你别看什么 62,65 之类的成绩,你要知道在小学低于 90 分基本上就是中下等了,唉,爱学习的人太多了!怎么着,那我把这个成绩单给老爸看看?好,我们修改一下类图,成绩单给老爸看:

老爸开始看成绩单,这个成绩单可是最真实的,啥都没有动过,原装,看 Father 类:

package com.cbf4life;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 老爸看成绩单了
*/
public class Father {

public static void main(String[] args) {
 //成绩单拿过来
 SchoolReport sr = new FouthGradeSchoolReport();

 //看成绩单
 sr.report();

 //签名?休想!
 }
} 
运行结果如下:
尊敬的XXX家长:
 ......
 语文 62 数学65 体育 98 自然 63
 .......
 家长签名: 
就这成绩还要我签字?!老爸就开始找笤帚,我的屁股已经做好了准备,肌肉要绷紧,要不那个太疼了!哈哈,幸运的是,这个不是当时的真实情况,我没有直接把成绩单交给老爸,而是在交给他之前做了点技术工作,我要把成绩单封装一下,封装分类两步走:

第一步:跟老爸说各个科目的最高分,语文最高是 75,数学是 78,自然是 80,然老爸觉的我成绩与最高分数相差不多,这个是实情,但是不知道是什么原因,反正期末考试都考的不怎么样,但是基本上都集中在 70 分以上,我这 60 多分基本上还是垫底的角色;

第二步:在老爸看成绩单后,告诉他我是排名第 38 名,全班,这个也是实情,为啥呢?有将近十个同学退学了!这个情况我是不说的。不知道是不是当时第一次发成绩单,学校没有考虑清楚,没有写上总共有多少同学,排名第几名等等,反正是被我钻了个空子。

那修饰是说完了,我们看看类图如何修改:

我想这是你最容易想到的类图,通过直接增加了一个子类,重写 report 方法,很容易的解决了这个问题,是不是这样?是的,确实是,确实是一个很好的办法,我们来看具体的实现:

package com.cbf4life;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 对这个成绩单进行美化
* Sugar这个词太好了,名词是糖的意思,动词就是美化
* 给你颗糖你还不美去
*/
public class SugarFouthGradeSchoolReport extends FouthGradeSchoolReport {

//首先要定义你要美化的方法,先给老爸说学校最高成绩
private void reportHighScore(){
 System.out.println("这次考试语文最高是75,数学是78,自然是80");
 }

//在老爸看完毕成绩单后,我再汇报学校的排名情况
private void reportSort(){
 System.out.println("我是排名第38名...");
 }

//由于汇报的内容已经发生变更,那所以要重写父类
@Override
public void report(){ 
 this.reportHighScore(); //先说最高成绩
 super.report(); //然后老爸看成绩单
 this.reportSort(); //然后告诉老爸学习学校排名
 }

} 
然后 Father 类稍做修改就可以看到美化后的成绩单,看代码如下:
package com.cbf4life;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 老爸看成绩单了
*/
public class Father {

public static void main(String[] args) {
 //美化过的成绩单拿过来
 SchoolReport sr= new SugarFouthGradeSchoolReport();

 //看成绩单
 sr.report();

 //然后老爸,一看,很开心,就签名了
 sr.sign("老三"); //我叫小三,老爸当然叫老三
 }
} 
运行结果如下:
这次考试语文最高是75,数学是78,自然是80
尊敬的XXX家长:
 ......
 语文 62 数学65 体育 98 自然 63
 .......
 家长签名:
我是排名第38名...
家长签名为:老三
        通过继承确实能够解决这个问题,老爸看成绩单很开心,然后就给签字了,但是现实的情况很复杂的,可能老爸听我汇报最高成绩后,就直接乐开花了,直接签名了,后面的排名就没必要了,或者老爸要先听排名情况,那怎么办?继续扩展类?你能扩展多少个类?这还是一个比较简单的场景,一旦需要装饰的条件非常的多,比如20 个,你还通过继承来解决,你想想的子类有多少个?你是不是马上就要崩溃了!
        好,你也看到通过继承情况确实出现了问题,类爆炸,类的数量激增,光写这些类不累死你才怪,而且还要想想以后维护怎么办,谁愿意接收这么一大堆类的维护哪?并且在面向对象的设计中,如果超过 2 层继承,你就应该想想是不是出设计问题了,是不是应该重新找一条道了,这是经验值,不是什么绝对的,继承层次越多你以后的维护成本越多,问题这么多,那怎么办?好办,装饰模式出场来解决这些问题,我们先来看类图:


增加一个抽象类和两个实现类,其中 Decorator 的作用是封装 SchoolReport 类,看源代码:

package com.cbf4life;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 装饰类,我要把我的成绩单装饰一下
*/
public abstract class Decorator extends SchoolReport{

//首先我要知道是那个成绩单
private SchoolReport sr;

//构造函数,传递成绩单过来
public Decorator(SchoolReport sr){ 
 this.sr = sr;
 }

//成绩单还是要被看到的
public void report(){
 this.sr.report();
 }

//看完毕还是要签名的
public void sign(String name){
 this.sr.sign(name);
 }

} 
         Decorator 抽象类的目的很简单,就是要让子类来对封装 SchoolReport 的子类,怎么封装?重写report 方法!先看 HighScoreDecorator 实现类:
package com.cbf4life;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 我要把我学校的最高成绩告诉老爸
*/
public class HighScoreDecorator extends Decorator {
//构造函数
public HighScoreDecorator(SchoolReport sr){
 super(sr);
 }

//我要汇报最高成绩
private void reportHighScore(){
 System.out.println("这次考试语文最高是75,数学是78,自然是80");
 }

//最高成绩我要做老爸看成绩单前告诉他,否则等他一看,就抡起笤帚有揍我,我那还有机会说呀
@Override
public void report(){
 this.reportHighScore();
 super.report(); 
 }
} 
重写了 report 方法,先调用具体装饰类的装饰方法 reportHighScore,然后再调用具体构件的方法,我们再来看怎么回报学校排序情况 SortDecorator 代码:
package com.cbf4life;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 学校排名的情况汇报
*/
public class SortDecorator extends Decorator {
//构造函数
public SortDecorator(SchoolReport sr){
 super(sr);
 }

//告诉老爸学校的排名情况
private void reportSort(){
 System.out.println("我是排名第38名...");
 }

//老爸看完成绩单后再告诉他,加强作用
@Override
public void report(){
 super.report();
 this.reportSort();
 }
} 
然后看看我老爸怎么看成绩单的:
package com.cbf4life;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 老爸看成绩单了
*/
public class Father {

public static void main(String[] args) {
 //成绩单拿过来
 SchoolReport sr;
 sr = new FouthGradeSchoolReport(); //原装的成绩单

 //加 了最高分说明的成绩单
 sr = new HighScoreDecorator(sr);

 //又加了成绩排名的说明
 sr = new SortDecorator(sr);

 //看成绩单
 sr.report();

 //然后老爸,一看,很开心,就签名了
 sr.sign("老三"); //我叫小三,老爸当然叫老三
 }
}
老爸一看成绩单,听我这么一说,非常开心,儿子有进步呀,从 40 多名进步到 30 多名,进步很大,躲过了一顿海扁。
这就是装饰模式,装饰模式的通用类图如下:


       看类图,Component 是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象,比如上面的成绩单,记住在装饰模式中,必然有一个被提取出来最核心、最原始、最基本的接口或抽象类,就是 Component。

       ConcreteComponent 这个事最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是这个东东。

       Decorator 一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个 private 变量指向 Component。

        ConcreteDecoratorA 和 ConcreteDecoratorB 是两个具体的装饰类,你要把你最核心的、最原始的、最基本的东西装饰城啥东西,上面的例子就是把一个比较平庸的成绩单装饰成家长认可的成绩单。

        装饰模式是对继承的有力补充,你要知道继承可不是万能的,继承可以解决实际的问题,但是在项目中你要考虑诸如易维护、易扩展、易复用等,而且在一些情况下(比如上面那个成绩单例子)你要是用继承就会增加很多了类,而且灵活性非常的差,那当然维护也不容易了,也就是说装饰模式可以替代继承,解决我们类膨胀的问题,你要知道继承是静态的给类增加功能,而装饰模式则是动态的给增加功能,你看上面的那个例子,我不想要 SortDecorator 这层的封装也很简单呀,直接在 Father 中去掉就可以了,如果你用继承就必须修改程序。

       装饰模式还有一个非常好的优点,扩展性非常好,在一个项目中,你会有非常多因素考虑不到,特别是业务的变更,时不时的冒出一个需求,特别是提出一个令项目大量延迟的需求时候,那种心情是…,真想骂娘!装饰模式可以给我们很好的帮助,通过装饰模式重新封装一个类,而不是通过继承来完成,简单点说,三个继承关系 Father,Son,GrandSon 三个类,我要再 Son 类上增强一些功能怎么办?我想你会坚决的顶回去!不允许,对了,为什么呢?你增强的功能是修改 Son 类中的方法吗?增加方法吗 ?对 GrandSon的影响哪?特别是 GrandSon 有多个的情况,你怎么办?这个评估的工作量就是够你受的,所以这个是不允许的,那还是要解决问题的呀,怎么办?通过建立 SonDecorator 类来修饰 Son,等于说是创建了一个新的类,这个对原有程序没有变更,通过扩充很好的完成了这次变更。


MATLAB新手必看:5分钟搞定直流无刷电机Simulink仿真(附完整模型下载) 本文为MATLAB新手提供直流无刷电机Simulink仿真的快速入门指南,涵盖从环境配置到速度控制闭环实现的完整流程。通过详细的模块选择和参数设置说明,帮助读者5分钟内搭建基础仿真模型,并附赠完整模型下载,助力快速掌握电机控制仿真技术。 阅读详情

相关推荐

基于SHIS凝视型短波红外高光谱相机(900-1700nm)区分不同宝石的差异性和可分性(宝石分选)

SHIS系列凝视型高光谱相机基于液晶可调谐滤波器(LCTF),通过电控LCTF进行连续细分窄波段分光,对每个波段进行高分辨率的二维面阵成像,进行图像处理后,获得完整的高光谱高清图像序列。具有低功耗、小型化、使用方便和易于扩展的优势。其工作波段覆盖400nm至1000nm,能够捕捉宝石在不同波长下的光谱特征,为宝石鉴定提供了新的工具。

wayho的博客 710

装饰模式简单的代码

装饰模式简单的代码:一个对象在构造函数的时候,持有另一个对象的引用。 package com.main.test; public class ZhuangShiPattener { public static void main(String[] args) { // TODO Auto-generated method stub Person perso...

dcqxxx0916的博客 200

VxWorks环境搭建与学习:vxworks6.8和workbench3.2

VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

qq_41854911的博客 8469

javaIO装饰者模式类图

装饰者可以扩展类的功能,这比继承更加弹性,减少类的数量

share_free的博客 1476

音频分割:长语音音频 分割为 短语音音频 - python 实现

音频分割:长语音音频 分割为 短语音音频 - python 实现

DATABALL 的博客 1207

中小公司无线组网实战:用一台H3C AC和普通三层交换,实现办公网AP统一管理

本文详细介绍了中小型企业如何利用H3C AC控制器与普通三层交换机实现无线AP统一管理的实战方案。通过VLAN规划、DHCP配置和AC控制器设置,构建经济高效的办公网络,解决信号覆盖和连接稳定性问题,特别适合50-200人规模的企业部署。

weixin_42531516的博客 382

装饰模式(Decorator pattern)

装饰模式(Decorator pattern): 又名包装模式(Wrapper pattern), 它以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 装饰模式以对客户透明的方式动态的给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。 装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展。 装饰模式 把客户端的调用委派到被装饰类...

dhxzfdv7839214的博客 168

VMware 安装 Windows11

一、下载win11的镜像文件 可以在MSDN网站下载: MSDN系统库-致力于原版windows生态服务 二、创建虚拟机 1.双击打开VMware虚拟机,点击创建新的虚拟机 2.选择典型(推荐),然后点击下一步 3.在安装程序光盘映像文件下,点击浏览按钮,选择Windows 11ISO镜像文件所在的路径,在Windows 11安装文件路径中不要有中文或其他特殊符号,否则有可能引起错误。然后点击下一步 4.在选择客户机操作系统界...

m0_56015193的博客 7021

装饰模式(Decorator Pattern)

装饰模式(Decorator Pattern)是一种结构型设计模式,它允许通过将对象包装在装饰器类的实例中来动态地添加新的行为和责任。这种模式可以在不修改现有代码的情况下,灵活地扩展对象的功能。

weixin_40026739的博客 1348

复现YOLOv8语义分割和目标检测训练自己的数据集

训练过程首先会显示你所使用的训练的硬件设备信息,然后下一段话则是你的参数配置,紧接着是backbone信息,最后是加载信息,并告知你训练的结果会保存在runs\segment\trainxx。(1)修改数据加载配置文件,在E:\project\MODEL\YOLO\yolov8-8.2.76\ultralytics-8.2.76\ultralytics\cfg\datasets。三、训练自己的数据集,segment数据集是json格式的。如果想使用多卡训练,device='\0,1,2,xxx\'

m0_56182552的博客 2764

BambuStudio学习笔记:OpenCSG - 实时构造实体几何(CSG)渲染的 OpenGL 方案

**OpenCSG** 是一个基于 **OpenGL** 的 **构造实体几何(CSG)** 实时渲染库,通过 **深度剥离算法** 实现布尔运算(并集、交集、差集)的可视化。其核心目标是简化复杂几何体的交互式建模,适用于 CAD 原型设计、3D 打印预览、教育工具等场景。

zzzkk2009的专栏 929

装饰模式(decorator-pattern)

如何避免继承导致的类数量指数级增长?如何更加优雅地给现有的类动态增添新的功能?装饰模式或许称得上首选。

geek! 1610

【2026年华为暑期实习(AI)-6月3日-第一题- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要: 本文探讨了深度学习与计算机科学中的多个关键概念和技术,包括CUDA双缓冲技术、神经网络训练问题、优化算法、概率模型、Transformer架构特性、量化技术、损失函数选择等。通过20道选择题和多项选择题,涵盖了梯度消失/爆炸、神经元死亡、牛顿迭代法、朴素贝叶斯分类、Adam优化器、KV Cache压缩等核心知识点。特别关注了大模型训练中的计算效率、数值稳定性问题,以及实际应用场景如客服Agent的记忆机制优化。题目设计既考察基础理论(如概率分布、指数分布特性),又结合前沿技术(如MoE架构、注意

m0_73659489的博客 81

装饰模式-Decorator Pattern

装饰模式的定义与特点 装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。 装饰(Decorator)模式的主要优点有: 采用装饰模式扩展对象的功能比采用继承方式更加灵活。 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。 其主要缺点是:装饰模式增加了许多子类,如果过度使用会使程序变得很...

心猿意碼 6416

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

装饰模式Decorator Pattern

动态地给对象增加额外的职责。

Resurgence03的博客 511

jre9下载 jdk9

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

装饰模式(Decorator Pattern)

一、模式动机 有时我们希望给某个对象而不是整个类添加一些功能。例如:一个图形用户界面工具箱允许我们对任意一个用户界面组件添加一些新的特性,如增加一个边框;或者增加一些行为,如窗口的滚动 一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象来添加边框。我们称这个嵌入的对象为装饰器(Decorator)。这个装饰与它所装饰的组件接口 一致,因此它对使用该组件的客户透明。它将客户请求转发给

Epsilon 543

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

装饰模式 Decorator Pattern

装饰模式的优点在于它提高了代码的灵活性和可扩展性,通过动态组合对象来扩展功能,而不是通过继承。这避免了在系统中大量使用继承,使得系统更加灵活和易于维护。

Shooter_whole的博客 406

C++装饰模式(Decorator Pattern)

意图 装饰模式就是对一个对象进行装饰,换句话说,就是对一个对象增加额外的功能。 需求 一位美女早上起来化妆,需要打粉底、画眉毛、涂口红、带耳环等过程。 需求分析 面对这样的需求,可以用单纯的添加方法,这是不可取的。如果遇到这位美女第二天想换另外一种方式,那怎么办呢?设计模式的根本目的及时实现高内聚、低耦合,这样对于编程来说,装饰模式是一个不错的选择。 参与者 1、Component 定义一个对象的...

qq_34837838的博客 252

3、装饰模式 Decorator Pattern

装饰模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 类该对扩展开放,对修改关闭 关羽装饰模式,网上各种吃喝示例。我这里就不借鉴别人的,自己来做个新的例子。当然还是离不开吃喝,用个老北京小吃来举例吧……卤煮火烧 好,首先我们先对卤煮进行分解,看看我们都需要实现什么东西。 基本的组成原料包括: 小肠:intestine 肺:lung 肝:liver 豆腐:tofu 饼:cake 首先卤煮最基础的就是底。可以理解为intestine+lung+liver+tofu。 还有

201

设计模式-装饰模式-decorator_pattern

装饰者同实际对象有相同的接口,并持有一个指向实际对象的引用,在调用实际对象的方法前后,可以执行额外的功能。在需要动态扩展功能时,装饰模式是一种有效的设计模式,但应该谨慎使用,避免上述问题的出现。装饰模式通过将对象包装在装饰者类中来动态地添加功能,这使得装饰者可以与原始对象无缝集成,同时保持高度的灵活性和可扩展性。在需要遵循开闭原则(对扩展开放,对修改关闭)的场景中,装饰模式允许在不修改现有代码的基础上扩展功能。在应用程序中,可以使用装饰模式为方法添加性能监测功能,以统计方法的执行时间。

wesigj的博客 1791

JAVA设计模式之 装饰模式【Decorator Pattern】

一、概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系。在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能。二、适用场景 装饰原有对象、在不改变原有对象的情况下扩展增强新功能/新特征.。当不能

小吕丶Code阶区 3369
上一篇: IDEA生成API接口文档
下一篇: 迭代器模式【Iterator Pattern】
涛濤
博客等级 码龄12年 136粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值