Java_23种设计模式之策略模式——一蓑烟雨任平生

Windows Server+SqlServer Always On实战:5步搞定高可用集群搭建 本文详细介绍了在Windows Server环境中,通过5个关键步骤搭建SQL Server Always On高可用集群的实战指南。内容涵盖从底层故障转移集群配置、SQL Server实例启用Always On功能,到创建可用性组和侦听器的完整流程,并提供了核心运维与故障排查思路,帮助企业构建稳定可靠的数据库高可用架构。 阅读详情


前言

这次我们来讲解一下策略模式,策略模式是我们日常开发天天都在用的“模式”,最简单if/else就是策略,而我们用不同的策略(分支)来实现结果的区分。所以策略模式是非常重要的模式,也是理解和应用最为简单的方式(大概)。

这里再次提醒:不要过分拘泥于设计模式的类和形式,只要记住一点:将变与不变抽离的过程就是设计模式


一、什么是策略模式?

策略模式按照最简单的理解就是对if/else的解耦,也是他最常用的场景,最典型的应用场景就是购物的时候,选择用优惠券,还是满2件送一件,或者凑够多少金额满减等等,按照一般的写法,我们经常会写出大量的if/else,在代码量较少的时候,这种写的方式既简单又方便,但是一旦代码复杂,复杂的if/else会让代码越来越屎,策略模式也是为了解决此问题而产生的。

策略模式是一种行为型模式,他将一类相似的行为解耦,并且将策略封装到具体的策略实现类。

策略模式结构图:

在这里插入图片描述

什么情况下使用策略模式?

  1. 当代码充斥大量if/else并且他们只是行为不同的时候,建议使用
  2. 将复杂的策略内容封装到单独的类情况下,比如我们的策略内容需要进行非常复杂的计算

策略模式的特点:

  1. 将相似的行为进行封包,客户端指定策略已达到不同行为的切换
  2. 将复杂的业务实现逻辑代码封装到单独的策略,可以通过context组合使用策略

工厂模式和策略模式的异同:

相同点:

  1. 策略的"执行对象"和工厂生产的“抽象对象”,他们都具有相似的行为。
  2. 都是为了抽离过程和结果实现本身。

不同点:

  1. 工厂模式是为了创建对象,而策略是为了解决复杂的if/else嵌套
  2. 工厂模式只需要传递工厂需要的参数,而策略模式则需要具体的实现类支撑。
  3. 工厂模式是创建型设计模式,而策略模式是行为型模式。前者专注于对象的创建过程,后者专注于对象的具体行为

如果上面不够清晰,那么下面我给出一个具体一些的案例来说说他们的区别:

​我们都知道低价手机的生产基本都是找代工厂,而代工厂可能不止生产一个品牌的手机,他可能承接多个品牌的手机生产,经销商让工厂生产指定的手机,而工厂负责手机的“创建”,这一模式就是典型的 工厂模式,而工厂根据不同的手机品牌,投入不同的生产材料和生成力,这个抉择的过程就是策略模式

场景模拟:

一些交易的系统,在遇到特殊情况的时候,需要进行网络监控或者管理,有时候需要根据某种条件下触发监控或者报警,比如网关接受一笔交易,需要根据交易的校验情况,在不同的校验代码段进行钉钉机器人报警,下面给出几种情况:

  • 查不出必要数据的时候,给出对应的告警。提醒运营人员排查线上环境
  • 当数据量到达指定的限制量的时候,给出风险告警。
  • 当出现黑名单人员进行交易拦截的时候,进行日志记录,不进行警告

不使用设计模式:

/**
 * 策略模式:
 * 不使用设计模式实现告警
 *  * home.php?mod=space&uid=686208 zxd
 * home.php?mod=space&uid=1248337 1.0
 * home.php?mod=space&uid=686237 2021/1/26 23:41
 */
public class Main {

    /**
    * 不使用模式
    */
    public static void main(String[] args) {
        System.out.println("接受交易");
        service1();
        service2();
        service3();
        System.out.println("完成交易");
    }

    /**
     * 模拟触发了业务场景1
     * 出现机房断电或者查不出必要数据的时候,给出对应的告警。提醒运营人员排查线上环境
     */
    private static void service1() {
        // 为了模拟异常情况,我们用 1/0 触发一个异常
        try {
            // 程序到了这一步算不下去了
            int result = 1/0;
            System.out.println("具体的业务");
        } catch (Exception e) {
            System.err.println("警告,服务器出现异常");
            System.out.println("开始执行报警");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            System.err.println("执行报警完成");
            throw e;
        }

    }

    /**
     * 模拟触发了业务场景2
     * 当数据量到达指定的限制量的时候,给出风险告警。
     */
    private static void service2() {
        int limit = 1000;
        int count = 2000;
        if(count > limit){
            System.out.println("开始执行报警");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            //.....
            // logger.info("警告,当前数据请求量达到限制值")
            System.err.println("执行报警完成");
        }

    }

    /**
     * 模拟触发了业务场景3
     * 当出现黑名单人员进行交易拦截的时候,进行日志记录,不进行警告
     */
    private static void service3() {
        boolean flag = true;
        if(flag){
            // 触犯黑名单:
            // logger.info("警告,当前请求");
            // 提前退出,结束交易
            return;
        }
        System.out.println("正常完成下面的步骤");
    }
}

上面的代码存在如下的问题:

  • 当我们需要新增一处监控的时候,需要在对应的代码块增加监控和报警的逻辑

  • 所有的改动都在一处,如果代码内容复杂会造成业务逻辑混淆

  • 当告警的业务日趋复杂,告警的代码将变得难以维护

使用工厂模式:

生产策略:

public class StrategyFactory {

    /**
     * 创建策略
     * home.php?mod=space&uid=952169 service
     * @return
     */
    public CaveatStrategy createStrategy(String service){
        // 数量监控
        if(Objects.equals(service, "quantity")){
            return new QuantityStrategy();
        }else if(Objects.equals(service, "noresult")){
            // 没有返回值
            return new NoResultStrategy();
        }else if(Objects.equals(service, "blacklist")){
            // 黑名单
            return new BlackListStrategy();
        }
        return null;
    }
}

黑名单策略类:

public class BlackListStrategy implements CaveatStrategy {

    @Override
    public void warning(Map<String, Object> params) {
        boolean flag = Boolean.parseBoolean(params.get("flag").toString());
        if (flag) {
            System.err.println("触犯黑名单列表,但不警告");
        }
    }
}

数量监控策略类:

public class QuantityStrategy implements CaveatStrategy {
    @Override
    public void warning(Map<String, Object> params) {
        int limit = Integer.parseInt(params.get("limit").toString());
        int count = Integer.parseInt(params.get("count").toString());
        if(count > limit){
            System.err.println("警告,当前数据内容无法获取返回值");
        }
    }
}

单元测试:

public class Main {

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        // 模拟交易流转参数对象
        Map<String, Object> objectObjectHashMap = new HashMap<>();
        StrategyFactory strategyFactory = new StrategyFactory();
        CaveatStrategy strategy = strategyFactory.createStrategy("quantity");

        // 表示除数和被除数
        objectObjectHashMap.put("limit", "1000");
        objectObjectHashMap.put("count", "2000");
        strategy.warning(objectObjectHashMap);

        strategy = strategyFactory.createStrategy("noresult");
        objectObjectHashMap.put("divisor", "1");
        objectObjectHashMap.put("dividend", "0");
        strategy.warning(objectObjectHashMap);

        strategy = strategyFactory.createStrategy("blacklist");
        objectObjectHashMap.put("flag", true);
        strategy.warning(objectObjectHashMap);
    }/*结果如下:
    警告,当前数据内容无法获取返回值
    触犯黑名单列表,但不警告
    */
}

上面的代码存在如下的问题:

  • 策略工厂虽然解决了策略的生产问题,但是需要自己指定策略,而且每次更换策略内容会导致工厂的代码也需要随之改动
  • 维护和扩展都需要依赖工厂,我们每多一个策略都需要更换工厂的内容
  • 当告警的业务日趋复杂,工厂的代码将会越发的臃肿

策略模式:

策略类的上下文:

public class StrategyContext {

    private CaveatStrategy strategy;

    public StrategyContext(CaveatStrategy strategy) {
        this.strategy = strategy;
    }

    public void doStrategy(Map<String, Object> params){
        strategy.warning(params);
    }
}

策略模式的单元测试:

public class Main {

    /**
     * 使用策略模式
     * @param args
     */
    public static void main(String[] args) {
        Map<String, Object> objectObjectHashMap = new HashMap<>();
        objectObjectHashMap.put("limit", "1000");
        objectObjectHashMap.put("count", "2000");
        objectObjectHashMap.put("divisor", "1");
        objectObjectHashMap.put("dividend", "0");
        objectObjectHashMap.put("flag", true);

        CaveatStrategy blackListStrategy = new BlackListStrategy();
        CaveatStrategy noResultStrategy = new NoResultStrategy();
        CaveatStrategy quantityStrategy = new QuantityStrategy();
        // 三种策略独立
        StrategyContext strategyContext4 = new StrategyContext(blackListStrategy);
        strategyContext4.doStrategy(objectObjectHashMap);
        strategyContext4 = new StrategyContext(noResultStrategy);
        strategyContext4.doStrategy(objectObjectHashMap);
        strategyContext4 = new StrategyContext(quantityStrategy);
        strategyContext4.doStrategy(objectObjectHashMap);
    }/*
    触犯黑名单列表,但不警告
    警告,当前数据内容无法获取返回值
    触犯黑名单列表,但不警告
    警告,当前数据内容无法获取返回值
    */
}

从上面的内容可以看出,我们只需要把策略传给上下文,上下文会根据传入的策略自动匹配对应的策略执行报警。

但是我们也发现了一些问题:

  • 代码存在new策略类,这又回到以前不使用工厂的时候情况了
  • 如果我们用策略组合,虽然少了很多的if/else,但是建立策略的细节依旧在客户端。

简单工厂+策略模式:

public class StrategyContext {

    private CaveatStrategyFactory caveatStrategyFactory = new CaveatStrategyFactory();

    public void doStrategy(String service, Map<String, Object> params){
        caveatStrategyFactory.createStrategy(service).warning(params);
    }
}
public class CaveatStrategyFactory {

    /**
     * 创建策略
     * @param service 策略
     */
    public CaveatStrategy createStrategy(String service){
        // 数量监控
        if(Objects.equals(service, "quantity")){
            return new QuantityStrategy();
        }else if(Objects.equals(service, "noresult")){
            // 没有返回值
            return new NoResultStrategy();
        }else if(Objects.equals(service, "blacklist")){
            // 黑名单
            return new BlackListStrategy();
        }
        return null;
    }
}

总结

本文在策略模式上做了进一步的深入思考,我对比了一下简单工厂和策略工厂,这两个模式可以说长得还是非常像的,仅仅靠这些简单的案例是不够的,还需要更多的灵活运用。

在这里插入图片描述

Android手机本地语音转文字实战:用FunASR+ONNX Runtime打造离线ASR应用(附模型下载) 本文详细介绍了如何在Android应用中集成FunASR和ONNX Runtime,构建高性能的离线语音识别系统。通过模型选择、工程化集成和性能调优等实战技巧,开发者可以实现本地语音转文字功能,有效保护用户隐私并提升响应速度。 阅读详情

相关推荐

ZYNQ开发(2)在Linux系统层上PL-PS通过AXI-DMA传输数据详细步骤及注意事项

参考的网络资料 https://github.com/bperez77/xilinx_axidma/tree/master https://gitlab.gnome.org/HosseinBeheshti/UlteraZed7EV/-/tree/master/petalinux/xilinx_axidma https://www.icode9.com/content-3-925319.html https://blog.youkuaiyun.com/weixin_38218267/article/details/1

aizaiyueye的专栏 3448

java23种设计模式之策略模式

上一节说到模板方法模式:https://blog.youkuaiyun.com/zhanglei082319/article/details/88906694 模板方法模式:java多态使用的一种体现,一个具体业务功能的父类实现中有些不能实现的功能,交给子类来实现,而且每种子类实现的方式都不相同,并且不会影响父类的整体业务实现。 今天我们说一种新的设计模式:策略模式 所谓的策略...

码眼的博客 242

Palabos User Guide中文解读 | 第一章 | 介绍

译者的话:本人在学习palabos时,发现国内中文资料甚少,恰好网上可以直接搜到palabos user guide这种英文资料,加之时间充裕,便打算开始翻译,能不能完成全本翻译再说,而且文中我也会标记我不确定的地方,以传达意思为主,翻译不当的地方还请各位读者帮忙指正。 Palabos User Guide Release 1.0 r1 Copyright © 2019 University of...

Yulan Fang's notes. 6977

Java中23种设计模式

Java中23种设计模式,包括简单介绍,适用场景以及优缺点等

呜呜老司机的博客家园 9万+

银河麒麟V10 SP3下NFS客户端挂载失败?5个常见问题排查与修复

本文针对银河麒麟V10 SP3系统中NFS客户端挂载失败的常见问题,提供了5个实战排查方案。从基础服务状态检查到防火墙配置、版本兼容性、/etc/fstab设置及权限映射,详细解析了问题根源与解决方案,帮助用户快速恢复NFS文件共享功能。

weixin_42525005的博客 358

电磁场仿真软件:Sonnet_(3).Sonnet用户界面与操作

Sonnet支持用户通过二次开发自定义工具,例如:编写Python脚本,实现自定义功能。将脚本保存为工具插件。在Sonnet中加载并使用自定义工具。# 示例:自定义工具 import sonnet def custom_tool(design , object , parameter , value) : """自定义工具示例,设置对象的指定参数。

kkchenjj的博客 1523

Java 中的 23 种设计模式详解

项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

微笑听雨 7万+

携程滑块、点选验证码登录识别逆向

本文分析了携程登录系统的风控机制,主要包含三种验证场景:无验证码、滑块验证码和二次图标点选验证码。通过跟踪risk_inspect风控接口,发现验证流程采用标准AES加密,需提交设备指纹等加密信息。当触发验证码时,需额外提交包含轨迹坐标的verify_msg参数及token/rid参数。最终通过风控检测后,需使用一致的指纹参数和验证token完成加密登录。文章强调所有分析仅用于学习,代码实现需确保符合法律规范。

码王吴彦祖的博客 1097

一次性讲清Java23种设计模式

基本掌握23种设计模式的基本概念并能够写出相应的例子。

wdj_yyds的博客 3458

同步调相机启动与并网控制技术方案

同步调相机起动与并网控制技术方案采用背靠背变流器系统,通过静止变频器(SFC)策略实现无原动机驱动的同步电机从静止到同步转速的平稳起动。方案详细阐述了硬件自检、模块初始化、转子位置检测等关键环节,重点解决启动转矩为零、冲击电流大等挑战。系统基于STM32或C2000系列控制器,包含网侧/机侧变流器、检测保护单元及通信接口,通过励磁脉冲和电压响应分析实现高精度转子初始定位,为后续并网提供必要条件。代码级实现涵盖了ADC自检、数字IO验证及通信端口测试等核心功能。

huanghm88的专栏 305

YOLOv11改进 - 卷积Conv | GCNet之金箍棒块GCBlock : 重参数化捕获全局依赖 | CVPR 2025

文介绍了GCBlock在YOLOv11中的结合应用。GCBlock是GCNet的核心组件,能高效捕获特征图中的全局依赖关系,融合了非局部网络和挤压 - 激励网络的优势,降低计算成本并保障模型性能。其遵循“上下文建模 - 特征变换 - 特征融合”框架,通过全局平均池化、全连接层等操作生成注意力权重。我们将GCBlock集成进YOLOv11,替代原有的部分卷积模块,实现更高效的全局上下文建模。实验证明,YOLOv11-GCBlock在目标检测任务中表现出色,展现了GCBlock在深度学习中的广泛应用前景。

魔改工程师的博客 905

Java的23种设计模式

大话java23种设计模式,通俗易懂

初心不忘、始终方得 6508

PCL 三维重建 基于B样条曲线的曲面重建算法

本文将介绍如何使用B样条曲线进行三维点云数据的曲面重建。B样条曲线和曲面是一种强大的数学工具,在计算机图形学、CAD设计等领域中广泛应用。通过对点云数据进行曲面拟合和优化,最终得到精确的曲面模型。本示例展示了如何利用PCL中的B样条曲线拟合算法进行三维曲面重建,并对重建结果进行可视化。

纵马踏花向自由 658

一文讲完Java常用设计模式(全23种)

设计模式是软件开发中非常有用的工具,可以提高代码的可重用性和可维护性,同时也可以提高开发人员的工作效率。 设计模式有几种类型,包括创建型、结构型和行为型模式。 创建型模式用于以灵活和高效的方式创建对象。包括Singleton模式、工厂模式和抽象工厂模式等。 结构型模式用于组合类和对象以形成更大的结构。包括适配器模式、桥接模式和装饰器模式等。 行为型模式用于处理类或对象之间的通信和控制流。包括观察者模式、策略模式和模板方法模式。

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 4万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IMSL CNL 7.0.0 (x86-64)Crack

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

JAVA最全设计模式(23种并附带示例)

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化、对请求排队或记录请求日志,以及支持可撤销的操作。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。定义: 创建型设计模式主要用于对象的创建过程,对对象的创建进行抽象,隐藏对象创建的具体逻辑。给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

qq_45105233的博客 8569

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java设计模式——策略模式

策略模式 介绍 意图:策略模式定义了一系列的算法,并将每一个算法封装起来,使每个算法可以相互替代,使算法本身和使用算法的客户端分割开来,相互独立。 主要解决: 在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。 何时使用: 一个系统有许多许多类,而区分它们的只是他们直接的行为。 如何解决: 将这些算法封装成一个一个的类,任意地替换。不是如何来实现算法,而是如何组织和调用这些算法,从而让我们的程序结构更加的灵活、可扩展。 关键代码: 实现同一个接口。 优点: 1、算法可以自由切换。 2、

Pluto372的博客 439

VC中sqlite的使用

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

一次讲全!Java常见的23种设计模式

设计模式是一套经过反复使用的代码设计经验,目的是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式于己于人于系统都是多赢的,它使得代码编写真正工程化,它是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。

m0_64363449的博客 2521

java中23种设计模式详解

封装了对象的创建过程:通过工厂模式,可以将对象的创建过程封装在一个工厂类中,客户端无需直接实例化具体的对象,只需要通过工厂类提供的接口获取对象即可。这样可以隐藏对象的具体实现,提高代码的可维护性和可扩展性。总的来说,工厂模式适用于对象的创建过程比较复杂,需要隐藏具体实现,降低客户端与具体对象的耦合,提高代码的可维护性和可扩展性的场景。可以根据需要返回不同的对象:工厂模式可以根据客户端的需求返回不同的对象,满足不同的业务需求。增加了系统的复杂度:引入工厂模式会增加系统中的类和对象的个数,增加了系统的复杂度。

weixin_49025285的博客 6571

JAVA中23种设计模式

一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式: 共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式: 共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式: 共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式

qw_0214的博客 1617

Java七种常用设计模式

抽象工厂模式(Abstract Factory Pattern)是Java中常用的一种创建型设计模式,它提供了一种创建一系列相关或相互依赖的对象接口,而无需指定它们具体的类。抽象工厂模式和工厂方法模式类似,不同之处在于抽象工厂模式中工厂类不单独生产一种产品,而是生产一系列相关的产品。定义抽象产品类:void use();定义具体产品类:System . out . println("使用ProductA1");System . out . println("使用ProductA2");

qq_45196093的博客 2万+

23种Java设计模式

Java 设计模式可以分为三大类:创建型模式 (Creational Patterns)、结构型模式 (Structural Patterns) 、行为型模式 (Behavioral Patterns)。另一类设计模式:J2EE 设计模式。

qq_41847894的博客 3845

Java常用设计模式(23种)

Java23种设计模式

weixin_52962125的博客 2808

Java进阶 23种设计模式 详解+应用+实例代码

文章目录前言一、单例模式1.概念2.单例模式应用(1) 懒汉式 基础版(2) 懒汉式 双重校验锁版(3) 饿汉式 单例模式(4)登记式 单例模式 前言 Java的 23种设计模式 创建型模式,共五种(1-5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种(6-12):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种(13-23):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式

Jiang_bug的博客 1万+

JAVA设计模式——23种设计模式详解

设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。通过设计模式可以帮助我们增强代码的可重用性、可扩充性、 可维护性、灵活性好。我们使用设计模式最终的目的是实现代码的高内聚和低耦合。

每日一记,每周一结。 3364

Java设计模式(疯狂Java联盟版)

1. 设计模式........................................................................................................................ 3 1.1 创建型模式

chuck_sun的专栏 3035

【Java 基础】-- 设计模式

Java 设计模式是提升代码质量的有力工具。掌握这些模式,可以在开发中编写出更加优雅、可维护的代码。建议通过实践不断加深理解,灵活运用设计模式解决实际问题!

欢迎来到我的博客,一起探索代码里的世界! 1766
上一篇: Python_Twisted-23.3.0-cp39-cp39-win_amd64&&&Twisted-23.3.0-cp38-cp38-win_amd64免费下载——一蓑烟雨任平生
下一篇: pip安装不是包名__一蓑烟雨任平生
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值