Java设计模式圣经连载(05)-代理模式

卷积操作复杂度公式推导 复杂度Hout⋅Wout⋅Cout⋅Cin⋅k2\text{复杂度} = H_{\text{out}} \cdot W_{\text{out}} \cdot C_{\text{out}} \cdot C_{\text{in}} \cdot k^2复杂度Hout​⋅Wout​⋅Cout​⋅Cin​⋅k2该公式反映了卷积核作用于每个像素时的局部操作和跨通道的计算需求。卷积计算复杂度与输入尺寸线性相关。 阅读详情
 
Java设计模式圣经连载(05)-代理模式
代理模式是一种非常重要的设计模式,在Java语言中有着广泛的应用,包括Spring AOP的核心设计思想,都和代理模式有密切关系。
 
代理模式主要分两种:一种是静态代理,一种是动态代理。两种代理方式的实现有着本质的差异。
 
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
 
代理模式一般涉及到的角色有:
抽象角色:声明真实对象和代理对象的共同接口。
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
 
下面分别介绍两种代理模式:
 
 
一、静态代理
 
静态代理代理和被代理对象在代理之前是确定的。他们都实现相同的接口或者继承相同的抽象类。下面看一个例子,代码参考阎宏博士的《Java与模式》一书,有改动。
 
/**
 * 抽象角色
 */
public abstract class Subject {
    abstract public void request();
}
 
/**
 * 真实角色:实现了Subject的request()方法
 */
public class RealSubject extends Subject {
 
    public RealSubject() {
    }
 
    public void request() {
        System.out.println("真实角色的请求方法RealSubject.request()被调用!");
    }
}
 
 
/**
 * 代理角色
 */
public class ProxySubject extends Subject {
    private RealSubject realSubject; // 以真实角色作为代理角色的属性
 
    public ProxySubject() {
    }
 
    // 该方法封装了真实对象的request方法
    public void request() {
        preRequest();               //代理前执行的操作
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        realSubject.request();     // 此处执行真实对象的request方法
        postRequest();              //代理后执行的操作
    }
 
    private void preRequest() {
        // something you want to do before requesting
        System.out.println("代理前执行的操作ProxySubject.preRequest()!");
    }
 
    private void postRequest() {
        // something you want to do after requesting
        System.out.println("代理后执行的操作ProxySubject.postRequest()!");
    }
}
 
/**
 * 客户端调用
 */
public class Client {
    public static void main(String[] args) {
        Subject sub = new ProxySubject();
        sub.request();
    }
}
 
运行客户端调用,结果如下:
 
代理前执行的操作ProxySubject.preRequest()!
真实角色的请求方法RealSubject.request()被调用!
代理后执行的操作ProxySubject.postRequest()!
 
Process finished with exit code 0
 
代码内容很简单,由以上代码可以看出,客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理 RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest()),可以处理一些其他问题。
 
另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个 代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。请看下面的动态代理模式。
 
二、动态代理
 
Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类:
 
(1)Interface InvocationHandler:该接口中仅定义了一个方法
public object invoke(Object obj,Method method, Object[] args)
在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。 这个抽象方法在代理类中动态实现。
 
(2)Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容
动态代理类
protected Proxy(InvocationHandler h):构造函数,用于给内部的h赋值。
 
static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
 
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)
动态代理类
 
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作
 
在使用动态代理类时,我们必须实现InvocationHandler接口。
 
下面看个例子,在静态代理的基础上改为动态代理:
 
/**
 * 抽象角色
 */
public interface Subject {
    public void request();
}
 
/**
 * 具体角色:被代理类
 */
public class RealSubject implements Subject {
    public RealSubject() {
    }
 
    public void request() {
        System.out.println("具体角色的请求方法RealSubject.request()被调用!");
    }
}
 
 
/**
 * 代理处理器
 *
 * 该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值;
 * 此外,在该类还实现了invoke方法,该方法中的 method.invoke(sub,args);
 * 其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,
 * args为执行被代理对象相应操作所需的参数。
 * 通过动态代理类,我们可以在调用之前或之后执行一些相关操作
 */
 
public class DynamicSubject implements InvocationHandler {
    private Object sub;       //被代理对象
 
    public DynamicSubject() {
    }
 
    /**
     * 构造方法,并初始化被代理对象
     * @param obj 是被代理的对象
     */
    public DynamicSubject(Object obj) {
        sub = obj;
    }
 
    /**
     *
     * @param proxy  指代理类
     * @param method 被代理的方法
     * @param args   被代理的方法所需要的参数数组
     * @return  在代理实例上处理方法调用并返回结果。
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理前执行的操作!");
        method.invoke(sub, args);
        System.out.println("代理后执行的操作!");
        return null;
    }
}
 
 
/**
 * 客户端
 */
public class Client {
    static public void main(String[] args) throws Throwable {
 
        RealSubject rs = new RealSubject();     // 在这里指定被代理类
        //通过被代理类对象声明一个代理类对象
        InvocationHandler dynamicSubject = new DynamicSubject(rs);
        Class<?> cls = rs.getClass();
 
        // 以下是一次性生成代理类实例:
        // 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
        Subject subject = (Subject) Proxy.newProxyInstance(
                cls.getClassLoader(),           //定义代理类的类加载器
                cls.getInterfaces(),            //代理类要实现的接口列表
                dynamicSubject);                //指派方法调用的调用处理程序:InvocationHandler对象
 
        subject.request();      //调用代理处理器上的方法
    }
}
 
 
运行结果:
 
代理前执行的操作!
具体角色的请求方法RealSubject.request()被调用!
代理后执行的操作!
 
Process finished with exit code 0
 
 
注释很详细,在此不再赘述。
 
从上面例子可以看出,动态代理的功能很强大,但主要还是依赖Java语言的自身特征来处理的。
 
总结一下,动态代理实现的步骤
1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法
2.创建被代理的类以及接口。
3.通过Proxy的静态方法。
newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 创建一个代理类。
4.通过代理调用方法。
 
 
 
 
参考资料:
阎宏博士的《Java与模式》
浪溪论坛:bbs.langsin.com

本文出自 “熔 岩” 博客,转载请与作者联系!

宝塔面板添加站点及运营商SSL免费证书的申请与使用 本文详细介绍在宝塔面板下如何正确添加站点、配置站点,及在运营商如何申请免费SSL证书,将其配置到宝塔站点里。 给你的网站加一把锁,教你免费SSL证书申请,配置到自己的网站中。 环境:Ubuntu server 18 工具:宝塔控制面板 平台:阿里云 Web服务器:Nginx 宝塔:https://www.bt.cn/ 阿里云:https://www.aliyun.com/ 腾讯云:https://cloud.tencent.com/ 要求: 1.宝塔控制面板搭建完毕。 2掌握域名解析的原理。 3.了解ht 阅读详情

相关推荐

树莓派教程(基于python编程)--入门篇

一:格式化SD卡 SD卡插入读卡器连接电脑,使用SDFormatter对SD卡进行格式化 (重装烧录也要进行着SD卡格式化操作) 二:下载官方镜像 http://downloads.raspberrypi.org/raspbian_latest 三:烧录SD卡 使用Win32DiskImager将镜像烧录到格式化后的SD卡 SD卡盘根目录(/boot)下新建一个命名为ssh的...

qq_42109746的博客 6万+

(05)-代理模式

Java设计模式圣经连载(05)-代理模式     代理模式是一种非常重要的设计模式,在Java语言中有着广泛的应用,包括Spring AOP的核心设计思想,都和代理模式有密切关系。   代理模式主要分两种:一种是静态代理,一种是动态代理。两种代理方式的实现有着本质的差异。   代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,

Mr.Simple的专栏 1358

手机流畅的秘密:拆解LPDDR5X在骁龙8 Gen2平台上的电源与信号完整性设计

本文深入解析了LPDDR5X内存与骁龙8 Gen2处理器在旗舰手机中的协同设计,重点探讨了0.5V超低电压下的电源完整性设计以及8.5Gbps高速传输中的信号完整性挑战。通过详细的电源树架构、关键器件选型和布线策略分析,揭示了如何实现高性能与低功耗的完美平衡,为手机流畅体验提供硬件保障。

weixin_30235225的博客 485

1.5、代理模式

Java设计模式圣经连载(05)-代理模式     代理模式是一种非常重要的设计模式,在Java语言中有着广泛的应用,包括Spring AOP的核心设计思想,都和代理模式有密切关系。   代理模式主要分两种:一种是静态代理,一种是动态代理。两种代理方式的实现有着本质的差异。   代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用

zc2003的专栏 370

ASPP - 空洞空间金字塔池化

文章目录1 空洞卷积1.1 空洞卷积的理解1.1.1 一维1.1.2 二维1.2 空洞卷积的优劣2. ASPP3. 代码 1 空洞卷积 1.1 空洞卷积的理解 1.1.1 一维 (a) 正常卷积:输入特征 Input feature,kernel = 3,stride = 1,pad = 1,输出特征 Output feature。 (b) 空洞卷积:与图 (a) 不同之处在于 pad = 2,同时引入一个 rate = 2(表示卷积核中参数间间隔的超参)。   还可通过下图进一步理解普通卷积与空洞卷

晓野豬 2万+

实战避坑:在Ubuntu 22.04上配置NVIDIA GPU Direct RDMA时,必须搞清的P2P DMA与IOMMU那些事

本文深入探讨在Ubuntu 22.04上配置NVIDIA GPU Direct RDMA时P2P DMA与IOMMU的关键问题,解析PCIe架构中的地址转换、P2P DMA与标准DMA的区别,以及IOMMU对性能的影响。通过实战案例和调优建议,帮助用户避免常见配置陷阱,提升AI训练集群的数据传输效率。

weixin_33720078的博客 446

访问者模式详解

汇总目录请点击访问:《设计模式目录汇总》 喜欢内容的话欢迎关注、点赞、收藏!感谢支持,祝大家祉猷并茂,顺遂无虞!

2601_96797912的博客 32

OpenFOAM-多孔介质模型(porous media)

文章目录一、多孔介质(porous media)二、使用步骤1.达西定律2.Darcy-Forchheimer3.OpenFOAM fvOptions4.paraview动画每帧显示时间(Annotate Time)5.参考内容总结 一、多孔介质(porous media) 在流体力学中,流体流经多孔介质是指流体流经多孔介质时的行为方式,如海绵或木材,或使用沙子或其他多孔材料过滤水。 我们将展示如何设置多孔层,并使用OpenFOAM模拟流体通过该介质。 二、使用步骤 1.达西定律 达西定律最初是由达西通.

zq93538196的博客 9939

设计模式之状态模式

状态模式是一种行为型设计模式,通过将对象的不同状态行为封装到独立的状态类中,使上下文对象在状态变化时自动切换行为。以外卖订单为例,不同状态(如待支付、配送中)对同一操作(如取消)有不同响应。状态模式避免了复杂的if/else判断,提升代码可维护性与扩展性。其核心由上下文(Order)、状态接口(OrderState)和具体状态类组成,通过委托机制实现状态间的平滑切换。

FallingGod的博客 312

Hypermesh二次开发实战:Tcl命令分类与常用函数详解(附避坑指南)

本文深入解析Hypermesh二次开发中Tcl命令的三大核心类别:界面命令、查询命令与修改命令。重点剖析了*createmark集合管理与hm_getvalue信息查询等关键函数的实战用法,并提供了避免Mark覆盖、生命周期管理等常见陷阱的实用指南,旨在帮助CAE工程师构建高效可靠的自动化前处理流程。

weixin_29233333的博客 242

基于FPGA的多级CIC滤波器实现四倍插值

基于FPGA的多级CIC滤波器实现四倍插值 原文链接:基于FPGA的多级CIC滤波器实现四倍插值 在《基于FPGA的多级CIC滤波器实现四倍抽取一》和《基于FPGA的多级CIC滤波器实现四倍抽取二》中我们先来了解滑动平均滤波器、微分器、积分器以及梳状滤波器原理以及它们的幅频响应。此篇我们将用verilog实现基于FPGA的多级CIC滤波器实现四倍插值。 1 CIC滤波器的基本概述 CIC(积分梳状...

baidu_34971492的博客 3142

Agent Skill 五大设计模式:从工程实践到落地指南

Skill 不是一段临时 Prompt,而是一个可复用、可测试、可迭代的任务流程模板。通常通过SKILL.mdWhen:什么情况下触发How:按什么步骤执行What:最终输出什么:哪些行为必须遵守、哪些行为禁止fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;用户意图Skill 路由工具调用 / MCP / API结构化输出检查与交付。

m0_62458145的博客 235

MATLAB 基于 Baker 映射和 Logistic 混沌序列的图像加解密实现

图像加密是信息安全领域的重要研究方向,在数字版权保护、隐私保护等领域有着广泛应用。本文将介绍基于 MATLAB 的 Baker 映射和 Logistic 混沌序列的图像加解密算法,该算法利用混沌系统的初值敏感性和伪随机性,能够有效地对图像进行加密和解密。基于 Baker 映射和 Logistic 混沌序列的图像加解密算法是一种有效的方法,可以应用于数字版权保护、隐私保护等领域。MATLAB 提供了强大的工具和函数,可以方便地实现该算法。

走向CTO的路上... 937

设计模式(unity游戏研发版)

当你使用图形用户界面类时通常会遇到一个问题。比如,你创建了自定义按钮类并允许客户端在按钮中注入自定义代码,这样当用户按下按钮时就会触发这些代码。观察者模式允许任何实现了订阅者接口的对象订阅发布者对象的事件通知。你可在按钮中添加订阅机制,允许客户端通过自定义订阅类注入自定义代码。在Unity中,这就像UnityEvent在Inspector中绑定多个回调。

m0_63330263的博客 128

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

设计模式之策略模式

策略模式是一种行为型设计模式,将可互换的算法封装为独立策略,使客户端可在运行时动态选择并切换算法。核心由策略接口、具体策略和上下文三部分组成。通过将算法与使用分离,实现解耦与灵活扩展。适用于多算法场景,如支付方式、排序策略等,避免冗长的if/else。

FallingGod的博客 419

精雕软件(JDpaint) 5.5 绿色版

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

设计模式指南 (Java 版)

设计模式是解决软件设计中常见问题的可复用方案,而非直接代码。本文以最简方式梳理三大类设计模式:创建型(如单例、工厂方法)、结构型(如适配器、装饰器)和行为型(如观察者、策略)。通过生活化类比与Java示例,强调“按需使用、避免过度设计”的原则,帮助理解其核心思想与实际应用。

sync_with_U 257

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Vue3 组合式函数(Composables)设计模式:从封装到复用

本文以一次因复制粘贴导致的全局状态污染事故为引,深入剖析 Vue 3 Composable 的三大陷阱:单例状态误用、生命周期钩子注册失效与异步请求竞态。作者通过重构实践,强调 Composable 复用的核心是“带生命周期的响应式上下文”,而非简单代码复用。提出关键规范:状态归属决定 ref 位置、钩子必须在 setup 同步执行、用序号或 AbortController 解决竞态,并倡导基于“状态与生命周期”判断抽取时机,最终提升代码健壮性与团队协作效率。

滴水成河,汇流成海 190

【第四部分:Agentic 智能体设计模式】18.Agent 并行化实战:任务拆分、并发执行与结果汇总

本文介绍 Parallelization(并行化模式)的原理与工程实现,重点分析 Fan-out / Fan-in、Sectioning、Voting、任务依赖、上下文隔离、并发控制及部分失败处理。结合采购合同并行分析案例与 Java CompletableFuture 代码,说明如何实现独立任务的并发执行、结构化结果汇总和证据校验。同时介绍 LangGraph 动态任务分发、OpenAI 并行 Subagent、LangChain 异步 Subagent 及 DeepSeek Super-agent 等近

weixin_42258782的博客 257

设计模式之访问者模式

访问者模式是一种行为型设计模式,核心思想是将操作从元素类中分离,通过“访问者”统一管理对对象结构的多种操作。适用于元素类型稳定但操作频繁变化的场景。其精髓在于双重分派:元素通过accept方法触发访问者visit,最终由元素和访问者的运行时类型共同决定具体执行逻辑。该模式避免了在元素类中添加大量方法,提升扩展性,但会增加类数量与复杂度。典型应用如编译器语法树遍历、报表统计等。

FallingGod的博客 138

设计模式之模板方法模式

模板方法模式通过定义算法骨架,将可变步骤延迟至子类实现,实现流程复用。核心是父类的final模板方法锁定执行顺序,子类仅需实现抽象方法或覆盖钩子。如冲泡饮品场景中,烧水、倒杯等固定步骤由父类完成,冲泡与加调料由子类定制。该模式避免代码重复,提升扩展性,适用于流程固定但部分步骤可变的场景。

FallingGod的博客 330

LangGraph 体系实战(下):中断恢复、流式、子图与设计模式

LangGraph的动态中断机制允许用户在图执行过程中设置暂停点,等待外部输入后再继续执行,提供了人机交互接口。当中断触发时,LangGraph会通过持久化机制保存当前图状态,并无限期等待直到用户恢复执行。中断通过在任意图节点中调用 interrupt()函数实现,该函数可以接收任何可 JSON序列化的值,并将该值暴露给调用方。中断触发后,调用方根据 interrupt()暴露的信息生成反馈,重新调用图时通过 Command将反馈传递给计算图,恢复图的运行。

不吃紫菜的博客 233

设计模式指南 (Java 版) ㊁

本文以简洁易懂的方式介绍Java中的设计模式,按创建型、结构型、行为型分类,重点解析简单工厂与工厂方法模式。通过现实案例(如造门、招聘)类比,阐明其核心思想:封装对象创建逻辑,提升代码可维护性。强调设计模式是解决问题的指导原则,而非万能药,应避免过度设计,合理使用方能发挥最大价值。

sync_with_U 175

Day37 · 设计模式

设计模式(Design Pattern)是前人总结的、针对软件设计中反复出现问题的经典解决方案模板。它不是可以直接抄来运行的代码,而是一套"思路 + 结构"。创建型(Creational):对象怎么创建——单例、工厂方法、抽象工厂、建造者、原型;结构型(Structural):类和对象怎么组合成更大的结构——适配器、装饰器、代理、外观、桥接、组合、享元;行为型(Behavioral):对象之间怎么分工通信——策略、模板方法、观察者、迭代器、责任链、命令、状态、备忘录、访问者、中介者、解释器等。

小嘉丶学长的博客 169

设计模式之策略模式核心概念和应用场景

打个比方:策略模式就像"出行方式选择器"你要去某个目的地,可以选择:开车、坐地铁、打车、骑车、步行每种出行方式就是一条"策略"你只需要告诉选择器"我要去XX",选择器会根据情况帮你选最合适的方式你不需要关心每种方式的具体实现(开车怎么开、地铁怎么坐)生活中的策略模式支付方式:微信、支付宝、银行卡、现金 → 支付时选择一种即可排序算法:快排、归并、堆排序 → 根据数据特点选择最优算法压缩方式:ZIP、RAR、7Z → 根据需求选择压缩策略/*** 权益消息发送策略接口。

qq_38196449的博客 197
上一篇: Java设计模式圣经连载(04)-单例模式
下一篇: Java与模式:适配器模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值