模版方法模式

RK3399快速上手 | 01- 开发环境搭建(固件烧写、编译工具链安装、kernel编译) 一、编译工具链 编译工具链使用gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu。 下载地址: https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/ wget https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabi 阅读详情

使用场景

把几个对象中相同方法放到模版对象中,目的是为了提升代码的维护性。

image

image

image

实现

/// <summary>
/// 日志文件信息
/// </summary>
class LogFile { }

/// <summary>
/// 云服务日志上传接口。
/// </summary>
interface ICloudService
{
    void SaveLogFile(LogFile logFile);
}
/// <summary>
/// 云服务器service模板
/// 模板方法模式
/// </summary>
abstract class CloudService : ICloudService
{
    /// <summary>
    /// 保存方法(通用方案)
    /// </summary>
    public void SaveLogFile(LogFile logFile)
    {
        //1、建立远程连接
        Connection();
        //2、序列化
        Serialize();
        //3、传输
        Transport();
        //4、回调
        Callback();
    }

    protected abstract void Connection();
    protected virtual void Serialize()
    {
        Console.WriteLine("日志文件序列化");
    }
    protected virtual void Transport()
    {
        Console.WriteLine("日志文件上传");
    }
    protected virtual void Callback()
    {
        Console.WriteLine("日志文件成功回调");
    }
}
/// <summary>
/// 阿里云服务
/// </summary>
class AliCloudService : CloudService
{
    protected override void Connection()
    {
        Console.WriteLine("建立阿里云连接");
    }
}
/// <summary>
/// 微软云服务
/// </summary>
class AzureCloudService : CloudService
{
    protected override void Connection()
    {
        Console.WriteLine("建立Azure云连接");
    }
}

以上代码,日志序列化、上传个、回调方法都是相同的操作,建立链接每个服务的实现不同,所以让各自去实现。形成了云服务器 service 统一模板。

下面客户端调用就实现了任意切换。

LogFile logFile = new LogFile();
ICloudService cloudService = new AliCloudService();
cloudService = new AzureCloudService();
cloudService.SaveLogFile(logFile);

如果具体的服务多了的话,客户端切换也不方便,为了更好实现,我们可以引入工厂模式。

class CloudServiceFactory
{
    public static ICloudService GetCloudService(string cloudServerType)
    {
        if (cloudServerType == null)
        {
            return null;
        }
        if (cloudServerType.Equals("ali"))
        {
            return new AliCloudService();
        }
        else if (cloudServerType.Equals("azure"))
        {
            return new AzureCloudService();
        }
        return null;
    }
}
//选择云服务器 - 工厂模式
LogFile logFile = new LogFile();
ICloudService cloudService = CloudServiceFactory.GetCloudService("azure");
cloudService.SaveLogFile(logFile);

总结

模版方法模式就是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。

NVIDIA Omniverse 技术浅析(二):USD 例如,一个用户可以负责场景的几何体设计,另一个用户可以负责材质和灯光的调整。USD 的开放性和可扩展性,结合 Omniverse 的 Kit 扩展框架,使得用户和开发者可以创建自定义的应用程序和工具,以满足特定的需求。USD 的材质和物理属性系统,结合 Omniverse 的 RTX 实时渲染技术,使得用户可以在虚拟环境中看到逼真的光影效果和物理模拟。USD 的时间轴和动画功能,结合 Omniverse 的物理属性系统,使得用户可以为虚拟环境中的元素创建复杂的动画和物理模拟。 阅读详情

相关推荐

GPU核心性能指标

内存科普 CPU缓存分为三类,一级缓存(L1)、二级缓存(L2)和三级缓存(L3)。CPU在实际数据读取中重要的却是一级缓存,因为一级缓存速度最快,二级缓存其次,三级缓存最慢,只是三级缓存的容量最大。 DDR1,DDR2,DDR3内存条(DDR是Double Data Rate双倍速率同步动态随机存储器的英文缩写)就是俗称的一二三代内存条。这三种内存条工艺不同,接口不同,性能不同,互不兼容。要区分它们,也不难。内存条可以用在CPU内存或者GPU显存中。比如 the NVIDIA Tesla M2050 GP

Charles Ren's Tech Blog 2万+

设计模式之模版方法

模版方法(Template Method)模式是一种行为型设计模式,它定义了一个操作(模板方法)的基本组合与控制流程,将一些步骤(抽象方法)推迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。这种设计方式将特定步骤的具体实现与操作流程分离开来,实现了代码的复用和扩展,从而提高代码质量和可维护性。

894

VMware17安装教程(附安装包)VMware17小白详细一键安装教程

VMware 17.5 是一款强大的虚拟机软件。本安装教程将为您详细介绍VMware17安装教程其下载、安装步骤及验证方法,助您轻松完成安装,开启虚拟化体验。

2501_91538706的博客 2万+

设计模式_模版方法模式

一、模版方法模式简介 二、Demo         现在我们通过一个小的Demo来认识模版方法模式,我们现在要对数组进行从小到大进行排序,可是我们都知道进行排序的算法很多,我们想看下每种算法的效率等等的,那么我们写的每种算法都可能有相同的部分,就好比把排序好的数组输出,这个方法是每个排序类都相同的,为了简洁代码,为了更好的阅读代码,因此我们可以把算法相同的部分抽象出来,写成一个模版

GitHubClub 1642

特征提取 Features Extraction

介绍了特征提取的基本概念,从分类变量,文本信息和图片信息中进行特征提取的方法,以及实现特征提取的类库

JasonH2021的博客 1万+

Android Profiler 帧率优化实战与性能调优

本文详细介绍了使用Android Profiler进行帧率优化与性能调优的实战方法。通过分析主线程状态、FPS曲线和渲染阶段耗时,精准定位卡顿根源,并提供减少过度绘制、优化绘制命令及改善资源使用的具体策略。文章结合电商、游戏等真实案例,帮助开发者有效解决卡顿问题,提升应用流畅度。

palm99的专栏 536

【设计模式】模版方法模式

模版方法模式 定义 在父类中定义一个操作的通用具体步骤,将这些步骤的实现细节交给子类来完成。这样可以使得子类在不更改操作的结构下,可以重新定义该操作的具体步骤。 简单实例 定义都是空洞乏味的,让我们以一个简单的例子来说明该模式是如何运作的。...

阳阳的博客 1762

硬件笔记——HDMI接口

HDMI可以同时传输视频信号、音频信号和控制信号。其中高速信号有四组:从Data TX到Data RX有3组差分数据信号(TMDS_DATA0~2)和一组差分时钟信号(TMDS_CLOCK)。以及若干低速线。脚编号信号名称信号类型功能说明1热插拔检测连接状态检测。接收端通过此引脚向源端发送高电平信号,通知其已连接并可以开始读取EDID。2UTILITY车载用途悬空3TMDS数据通道2差分信号正极,用于传输视频像素、音频和数据包。4TMDS数据2屏蔽。

2501_94625908的博客 533

设计模式之禅(三):模版方法模式,介绍+demo+HttpServlet中的模版方法运用

Template Method Pattern is a behavioral design pattern that defines the skeleton of an algorithm in the superclass but lets subclasses override specific steps of the algorithm without changing its structure.

人在江湖 1116

VS Code配合Prettier自动格式化代码

每次修改 .prettierrc.cjs 配置文件后,如果发现保存代码时格式化没有生效,可能是 VS Code 插件缓存未及时刷新。建议此时重启 VS Code,确保新的配置被正确加载并生效。

分享技术,分享经验 7421

基于STM32+RFID设计的宿舍检修管理系统

设计一个上位机,用来管理查看维修检修信息,当维修寝室的设备或者检修完成时,通过STM32上的RC522刷一下这个寝室的IC卡,识别这是哪个寝室,识别成功后在软件上弹出一个对话框,填写本次维修或者检修的事件,填写完毕点击提交即可。...

2555

Java 设计模式-模版方法模式

java 设计模式-模版方法模式

精神小牛马 5279

DO-297标准详解:IMA系统开发与认证指南

DO-297的前言部分为读者提供了本指南的概述,说明了该标准的编写背景、主要目标、目标受众以及该文件在开发和认证集成模块化航空电子(IMA,Integrated Modular Avionics)系统中的作用。作为现代航空电子架构的重要组成部分,IMA系统大幅度简化了航空电子系统的硬件配置,增加了灵活性并降低了成本。因此,DO-297成为确保IMA系统开发、集成和认证符合适航标准的核心文件。在现代航空领域,系统复杂性逐渐增加,传统上各子系统独立运行的方式已经不适应多任务、多功能的需求。

qq_41854911的博客 1583

十五、模版方法模式

讲解了模版方法模式,并介绍了其在Spring中的使用。

qq_61350148的博客 717

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

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【设计模式】【九】模版方法模式

1.模版方法模式简介模版方法模式介绍在软件开发中,有时会遇到类似的情况,某个方法的实现需要多个步骤,其中有些步骤是固定的,而有些步骤并不固定,存在可变性。为了提高代码的复用性和系统的灵活性,可以使用模板方法模式来应对这类情况。模版方法模式定义定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。模版方法模式结构图 AbstractClass

帅胖子的博客 683

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

设计模式之模版方法模式

jdk 中的 InputStream 类的设计就使用了模版方法。而 read(byte b[]) 调用了 read(byte b[], int off, int len) 方法,所以此处 read(byte b[], int off, int len) 方法是模版方法,其定义了算法的步骤,read() 是算法中抽象化的某个步骤,由子类。模版方法模式的概念、模版方法模式的结构、模版方法模式的优缺点、模版方法模式的使用场景、模版方法模式的实现示例、模版方法模式的源码分析。

后端为主,前端为辅。 456

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java设计模式解析之十四——模版方法模式

模版方法模式1.前言2.特点 1.前言 设计模式共有23种,根据目的准则分类,分为三类 创建型设计模式,共5种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 结构型设计模式,共7中:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、响元模式。 行为设计模式,共11种:策略模式、模版方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 这里介绍一下模版方法模式。 2.特点 定义: ...

fanhenghao的博客 314

第八章 模版方法模式

在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

Shaw的专栏 504

设计模式十五之模版方法模式

设计模式十五之模版方法模式1. 模式的定义与特点1.1 模式的定义1.2 模式的特点1.3 模式的使用场景2. 模式的结构与实现2.1 模式的结构2.2 模式的实现3. 模式在开源软件中的应用3.1 java.util.AbstractList 类   在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还...

pizicai007的博客 163

设计模式(12) 模版方法模式

**定义:**定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。 **类型:**行为类模式 类图: ​ 事实上,模版方法是编程中一个经常用到的模式。先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来。经过分析之后,这个任务大体上可分为两部分,排序和打印,...

cowbin2012的专栏 1万+

模版方法设计模式

模版方法设计模式 未使用模板方法设计模式 首先看一个不使用模版方法设计模式的几个类 可以将Student类和Worker类中的day()方法内的代码看作是算法,可以发现,Student类和Worker类的算法相同,不同的只是算法的每一个步骤的具体实现细节。 两个类中的算法相同,每个类也都要写一遍,代码冗余,而且修改算法步骤也不方便 public class Student { /**/ public void day(){ System.out.println("学生起床")

芒果小洛 204

设计模式 模版方法模式 展现程序员的一天

继续设计模式~ 模版方法模式 老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。 简单看下定义,模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现。定义还算清晰,下面来个例子展示下本公司的上班情况(纯属娱乐,如有雷同,请对号入座)。简单描述一下:本公司有程序猿、测试、HR、项目经理等人,下面使用

Hongyang 2万+

【设计模式-行为型】模版方法模式

今天爸爸在看电视没有烟抽了,也快吃饭了没有酒喝了。这个时候 爸爸把你叫过来,来给你30块钱,你给我去买个烟,在买个酒, 剩下的钱你自己支配。这个例子就是模板方法模式,它通过在抽象类中定义一个算法的骨架,将一些步骤延迟到子类中实现,从而在不改变算法结构的情况下,允许子类重新定义算法中的某些步骤。在这个例子中,爸爸给你30块钱,让你去买烟和酒,剩下的钱你自己支配。爸爸定义了任务的总体步骤(买烟、买酒、处理剩余钱),这些步骤的顺序是固定的,但具体的购买细节(如烟和酒的价格)由你(子类)来实现。

qq_36038282的博客 887

设计模式模版方法

概述 模版方法就是定义一个算法的骨架,将骨架中的特定步骤延迟到子类中。模板方法模式使得子类可以不改变算法的结构即可重新定义(重写)该算法的某些特定步骤。 优缺点 优点 解决了代码的重复问题 提高了代码的可扩展性 规定了代码的执行流程 缺点 每增加一个实现,必须增加一个子类 例子 中国的伟大在于五千年的历史,诞生了属于自己的医学体系,时至今日,人们看病可以选择中医和西医,两者的去医院看病的大概流程是一致的,但是诊断方法并不同,通过代码形式展现出来。 挂号→诊断→缴费→取药 抽象模版 /** * @a

qq_38306425的博客 557
上一篇: 适配器模式
下一篇: WebApi实现原理
似水明俊德
博客等级 码龄8年 247粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值