swift语言设计模式介绍-行为型模式

Swift设计模式之单例(SINGLETON) Swift是一门新的语言,每一门语言都有其特点,如何在Swift下实现单例设计模式呢? 阅读详情

内容列表:

行为型模式

创建型模式

结构型模式

1.行为型模式

行为模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。行为模式不仅仅是关于类和对象的,而且是关于它们之间的相互作用的。行为模式增加了对象相互交流的灵活性。

1.1 责任链模式(chain of responsibility pattern)

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

class MoneyPile {
    let value: Int
    var quantity: Int
    var nextPile: MoneyPile?

    init(value: Int, quantity: Int, nextPile: MoneyPile?) {
        self.value = value
        self.quantity = quantity
        self.nextPile = nextPile
    }

    func canWithdraw(var v: Int) -> Bool {

        func canTakeSomeBill(want: Int) -> Bool {
            return (want / self.value) > 0
        }

        var q = self.quantity

        while canTakeSomeBill(v) {

            if (q == 0) {
                break
            }

            v -= self.value
            q -= 1
        }

        if v == 0 {
            return true
        } else if let next = self.nextPile {
            return next.canWithdraw(v)
        }

        return false
    }
}

class ATM {
    private var hundred: MoneyPile
    private var fifty: MoneyPile
    private var twenty: MoneyPile
    private var ten: MoneyPile

    private var startPile: MoneyPile {
        return self.hundred
    }

    init(hundred: MoneyPile, 
           fifty: MoneyPile, 
          twenty: MoneyPile, 
             ten: MoneyPile) {

        self.hundred = hundred
        self.fifty = fifty
        self.twenty = twenty
        self.ten = ten
    }

    func canWithdraw(value: Int) -> String {
        return "Can withdraw: \(self.startPile.canWithdraw(value))"
    }
}

// Create piles of money and link them together 10 < 20 < 50 < 100.
let ten = MoneyPile(value: 10, quantity: 6, nextPile: nil)
let twenty = MoneyPile(value: 20, quantity: 2, nextPile: ten)
let fifty = MoneyPile(value: 50, quantity: 2, nextPile: twenty)
let hundred = MoneyPile(value: 100, quantity: 1, nextPile: fifty)

// Build ATM.
var atm = ATM(hundred: hundred, fifty: fifty, twenty: twenty, ten: ten)
atm.canWithdraw(310) // Cannot because ATM has only 300
atm.canWithdraw(100) // Can withdraw - 1x100
atm.canWithdraw(165) // Cannot withdraw because ATM doesn't has bill with value of 5
atm.canWithdraw(30)  // Can withdraw - 1x20, 2x10

(个人解释)100元类,50元类,20,10元类从前到后一次处理给定的钱数,每个类对不能够处理的钱数留给下一个类进行处理。

1.2 命令模式(command pattern)

命令模式用来表示命令对象的一种需求,需求的调用者以及所有必要的参数。命令可以立即执行,也可以留作以后使用。

protocol FileOperationCommand {
    init(file: String)
    func execute()
}

class FileMoveCommand : FileOperationCommand {
    let file:String

    required init(file: String) {
        self.file = file
    }

    func execute() {
        print("\(file) moved")
    }
}

class FileDeleteCommand : FileOperationCommand {
    let file:String

    required init(file: String) {
        self.file = file
    }

    func execute() {
        print("\(file) deleted")
    }
}

class FileManager {
    let deleteCommand: FileOperationCommand
    let moveCommand: FileOperationCommand

    init(deleteCommand: FileDeleteCommand, moveCommand: FileMoveCommand) {
        self.deleteCommand = deleteCommand
        self.moveCommand = moveCommand
    }

    func delete() {
        deleteCommand.execute()
    }

    func move() {
        moveCommand.execute()
    }
}

let deleteCommand = FileDeleteCommand(file: "/path/to/testfile")
let moveCommand = FileMoveCommand(file: "/path/to/testfile")
let fileManager = FileManager(deleteCommand:deleteCommand , moveCommand: moveCommand)

fileManager.delete()
fileManager.move()

1.3 迭代器模式( iterator pattern)

迭代器模式是用来提供一个标准的接口,遍历一个集合对象的所有子元素,而不需要知道他们的底层结构。

1.4 中介者模式 (mediator pattern)

中介者模式是用来减弱两个互相通信的类之间的耦合度。替代直接通信的方式,需要知道这两个类的实现,他们通过中介者对象发送消息。

1.5 备忘录模式 (memento pattern)

备忘录模式是用来捕捉一个对象当前的状态并存下,利用这样的方式,它可以在晚些时候在不打破封装规则的前提下,恢复出来。

typealias Memento = Dictionary<NSObject, AnyObject>

/**
* Originator
*/
class GameState {
    var gameLevel: Int = 1
    var playerScore: Int = 0

    func saveToMemeto() -> Memento {
        return ["gameLevel": gameLevel, "playerScore": playerScore] 
    }

    func restoreFromMemeto(memento: Memento) {
        gameLevel = memento["gameLevel"]! as Int
        playerScore = memento["playerScore"]! as Int
    }
}

/**
* Caretaker
*/
class CheckPoint {
    class func saveState(memento: Memento, keyName: String = "gameState") {
        let defaults:NSUserDefaults = NSUserDefaults.standardUserDefaults()
        defaults.setObject(memento, forKey: keyName)
        defaults.synchronize()
    }

    class func restorePreviousState(keyName: String = "gameState") -> Memento {
        let defaults:NSUserDefaults = NSUserDefaults.standardUserDefaults()

        return defaults.objectForKey(keyName) as Memento
    }
}

var gameState = GameState()
gameState.gameLevel = 2
gameState.playerScore = 200

// Saves state: {gameLevel 2 playerScore 200}
CheckPoint.saveState(gameState.saveToMemeto())

gameState.gameLevel = 3
gameState.gameLevel = 250

// Restores state: {gameLevel 2 playerScore 200}
gameState.restoreFromMemeto(CheckPoint.restorePreviousState())

gameState.gameLevel = 4

// Saves state - gameState2: {gameLevel 4 playerScore 200}
CheckPoint.saveState(gameState.saveToMemeto(), keyName: "gameState2")

gameState.gameLevel = 5
gameState.playerScore = 300

// Saves state - gameState3: {gameLevel 5 playerScore 300}
CheckPoint.saveState(gameState.saveToMemeto(), keyName: "gameState3")

// Restores state - gameState2: {gameLevel 4 playerScore 200}
gameState.restoreFromMemeto(CheckPoint.restorePreviousState(keyName: "gameState2"))

1.6 观察者模式( observer pattern)

观察者模式是允许一个对象发布自己状态的变化,然后那些订阅的对象能够立即得知这些变化。

class StepCounter {
    var totalSteps: Int = 0 {

        willSet(newTotalSteps) {
            println("About to set totalSteps to \(newTotalSteps)")
        }

        didSet {

            if totalSteps > oldValue  {
                println("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}

let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps

1.7 状态模式( state pattern)

状态模式目的是当对象内部状态变化时,改变对象的行为。该模式允许对象运行时的变化。

class Context {
    private var state: State = UnauthorizedState()

    var isAuthorized: Bool {
        get { return state.isAuthorized(self) }
    }

    var userId: String? {
        get { return state.userId(self) }
    }

    func changeStateToAuthorized(#userId: String) {
        state = AuthorizedState(userId: userId)
    }

    func changeStateToUnauthorized() {
        state = UnauthorizedState()
    }

}

protocol State {
    func isAuthorized(context: Context) -> Bool
    func userId(context: Context) -> String?
}

class UnauthorizedState: State {
    func isAuthorized(context: Context) -> Bool { return false }

    func userId(context: Context) -> String? { return nil }
}

class AuthorizedState: State {
    let userId: String

    init(userId: String) { self.userId = userId }

    func isAuthorized(context: Context) -> Bool { return true }

    func userId(context: Context) -> String? { return userId }
}

let context = Context()
(context.isAuthorized, context.userId)
context.changeStateToAuthorized(userId: "admin")
(context.isAuthorized, context.userId) // now logged in as "admin"
context.changeStateToUnauthorized()
(context.isAuthorized, context.userId)

1.8 策略模式( strategy pattern)

策略模式是用来产生一族可交换的算法以供程序运行时选择。

protocol PrintStrategy {
    func printString(string: String) -> String
}

class Printer {

    let strategy: PrintStrategy

    func printString(string: String) -> String {
        return self.strategy.printString(string)
    }

    init(strategy: PrintStrategy) {
        self.strategy = strategy
    }
}

class UpperCaseStrategy : PrintStrategy {
    func printString(string:String) -> String {
        return string.uppercaseString
    }
}

class LowerCaseStrategy : PrintStrategy {
    func printString(string:String) -> String {
        return string.lowercaseString
    }
}

var lower = Printer(strategy:LowerCaseStrategy())
lower.printString("O tempora, o mores!")

var upper = Printer(strategy:UpperCaseStrategy())
upper.printString("O tempora, o mores!")

1.9 访问者模式(visitor pattern)

访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。

protocol PlanetVisitor {
    func visit(planet: PlanetEarth)
    func visit(planet: PlanetMars)
    func visit(planet: PlanetGliese581C)
}

protocol Planet {
    func accept(visitor: PlanetVisitor)
}

class PlanetEarth: Planet {
    func accept(visitor: PlanetVisitor) { visitor.visit(self) }
}
class PlanetMars: Planet {
    func accept(visitor: PlanetVisitor) { visitor.visit(self) }
}
class PlanetGliese581C: Planet {
    func accept(visitor: PlanetVisitor) { visitor.visit(self) }
}

class NameVisitor: PlanetVisitor {
    var name = ""

    func visit(planet: PlanetEarth)      { name = "Earth" }
    func visit(planet: PlanetMars)       { name = "Mars" }
    func visit(planet: PlanetGliese581C) { name = "Gliese 581 C" }
}

let planets: [Planet] = [PlanetEarth(), PlanetMars(), PlanetGliese581C()]

let names = planets.map { (planet: Planet) -> String in
    let visitor = NameVisitor()
    planet.accept(visitor)
    return visitor.name
}

names
文章翻译自github项目,地址如下:
点击打开链接https://github.com/ochococo/Design-Patterns-In-Swift#behavioral

保姆级教程:用YOLOv5s训练PCB缺陷检测模型(附北大公开数据集) 本文提供了一份基于YOLOv5s的PCB缺陷检测模型从零开始的完整实战教程。详细解析了如何使用北大公开数据集,涵盖环境搭建、数据处理、模型训练、性能评估及优化部署全流程,并针对工业场景中常见的类别不均衡问题给出了具体解决方案,旨在帮助开发者快速构建高精度的自动化质检系统。 阅读详情

相关推荐

条码打印工具-Bartender的使用

文章目录1、安装Bartender1.解压安装包,可获得bartender2021版本和破解文本2. 双击“BarTender_2021_R1_Full_x64.exe”文件运行,勾选协议及软件安装设置3. 选择安装选项,自行选择勾选,点击Browser可更换软件安装路径4. 耐心等待软件安装完成,直接点击完成退出5. 此时会弹出提示需要激活许可证,先点击取消6. 接着将Crack夹中的“BarTend.exe”破解文件复制到软件安装目录中替换7. 再双击“serial.reg”导入注册,点击确定即可8.

暮紫的笔记本 1万+

iOS swift 自定制控件(数字键盘)

最近学习ios编程,启用了swift语言,非常高效的一门y

backpackcsdn的专栏 1422

Windows 11下JDK 21与JMeter 5.6.3环境配置全攻略

环境变量是操作系统管理软件路径与执行权限的核心机制,它通过预设的键值对,指引系统在调用命令时定位可执行文件。理解其工作原理,是解决软件安装后“命令未找到”等问题的关键。对于Java生态而言,正确配置JAVA_HOME和Path变量,不仅能让java、javac等基础命令全局可用,更是Maven、Gradle乃至JMeter等众多工具链顺畅运行的基石。JMeter作为一款基于Java开发的经典性能测试与接口测试工具,其稳定运行高度依赖健全的Java环境。本文聚焦于在Windows 11系统上,为JDK 21与

weixin_30940783的博客 449

Swift 自定义视图:简单的数量选择控件

学习使用Swift自定义一个简单的视图,传入一个最大值和一个最小值,控件的数字选择和输入范围控制在miniValue和maxValue之间,用于购物模块的数量选择,效果看下图: 1,创建一个view,并完成初始化 class NumberSelectView: UIView{ override init(frame: CGRect) { super.init(fr

我是闰土你是猹的博客 1266

学习STM32的流体水位传感器

引言: 流体水位传感器是一种常用于测量液体水位的设备,广泛应用于水位监测、液位控制和流量计量等领域。STM32是一款功能强大的单片机,具有丰富的外设和灵活的编程能力,非常适合用于流体水位传感器的开发。本文将介绍如何使用STM32开发板与流体水位传感器进行连接和通信,并通过编写代码实现水位的测量和显示。五、总结: 通过以上的代码示例,我们可以实现使用STM32开发板与流体水位传感器进行连接和通信的功能。三、编写代码: 以下是使用STM32CubeIDE编写的示例代码,实现了读取流体水位传感器的功能。

xiaoalla的博客 739

23设计模式之解释器模式(Interpreter)

返回首页 一、概述         Interpreter属于行为型模式中的一种,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 二、适用性         当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:         1. 该文法

路漫漫其修远兮,吾将上下而求索! 710

华为OD机考双机位C卷 - 虚拟理财游戏(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 虚拟理财游戏(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 668

行为型设计模式在Swift中的优雅实现

行为型设计模式在Swift中的优雅实现 【免费下载链接】Design-Patterns-In-Swift ???? Design Patterns implemented in Swift 5.0 项目地址: https://gitco...

gitblog_00985的博客 357

SKILL 是什么?怎么做?五分钟 带你从入门到精通

skill-creator 是 Anthropic 官方开源的“元技能”——一个专门用来创建 Skill 的 Skill。你只需要用自然语言描述想要什么功能,它会自动生成。从更宏观的视角看,Skills 的出现标志着 AI 编程的一次范式转变。在传统的 AI 编程中,代码是确定性的:1 是 1,2 是 2。但到了大模型时代,代码变得不确定——你不知道模型会输出什么,不知道它会不会突然删掉几行代码。这种不确定性让很多开发者感到不安。Skills 把这套逻辑又拉了回来。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 640

仿真学习系列(四十九):Sigrity仿真之电容库制作

在高速电路设计中,电源完整性(PI)是确保系统稳定、可靠运行的关键因素。随着电子产品对性能的要求不断提升,PDN(电源分配网络)的设计与优化变得尤为重要。为了确保电源网络在高速工作状态下不会引发电压波动和信号干扰,我们需要在设计中精确地选择电容器进行优化,而电容库的制作则是这一过程的核心。 OptimizePI作为一个强大的电源完整性优化工具,能够帮助设计师根据不同的目标,批量进行PDN仿真,以得出最佳电容选择。

案例文章,高速信号 223

Swift设计模式宝典:深入解析Design-Patterns-In-Swift项目

Swift设计模式宝典:深入解析Design-Patterns-In-Swift项目 【免费下载链接】Design-Patterns-In-Swift ???? Design Patterns implemented in Swift 5.0 ...

gitblog_01004的博客 825

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

第一次安装宝塔mysql服务是默认关闭的,需要手动打开,打开服务再次进入phpMyAdmin发现可以进入了。

吻等离子的博客 2869

Swift设计模式完整清单:Awesome-Swift-Education中的23种经典模式

Swift设计模式是每个iOS开发者必须掌握的核心技能,它能帮助你构建更优雅、可维护的应用程序。在Awesome-Swift-Education这个优秀的Swift学习资源库中,你可以找到23种经典设计模式的详细实现和讲解,这些模式涵盖了创建型、结构型和行为型三大类别,为你的Swift编程之旅提供完整指南。 ## 🔥 为什么学习Swift设计模式? 设计模式是经过验证的解决方案,能够解决软件

gitblog_00291的博客 1006

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Swift设计模式完全指南:23种模式从入门到精通

Swift设计模式完全指南是一份全面解析23种设计模式在Swift 5.0中实现的实用教程,旨在帮助开发者掌握软件设计的核心思想与实践方法。无论你是刚入门的新手还是有经验的开发者,这份指南都能让你系统学习如何运用设计模式解决实际开发问题,提升代码质量与可维护性。 ## 为什么学习Swift设计模式? 设计模式是软件开发中的最佳实践总结,它们提供了经过验证的解决方案来应对常见的设计问题。在Swi

gitblog_00190的博客 373

IMSL CNL 7.0.0 (x86-64)Crack

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

Swift 设计模式在标准库与第三方框架中的体现(36)

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式通常用于需要全局访问的资源,如配置管理、数据库连接、网络请求管理器等。在 Swift 中,单例模式的实现有多种方式,但最常见和推荐的方式是使用静态属性和私有初始化器。这种实现方式既简洁又安全,能够确保单例的线程安全性和唯一性。工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,将对象的创建和使用分离。工厂模式通过一个工厂类或工厂方法来负责创建对象,而不是在客户端代码中直接实例化对象。

Android开发领域创作者 1148

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【ios开发技术】Swift 语言深入--Swift设计模式 (1/2)

iOS设计模式- 你很可能听说过这个词,但是你真的知道它什么意思么?虽然大多数开发者都同意设计模式非常重要,但于此同时,并没有很多文章写这个内容,而且我们作为开发者在写代码时也有时不在意设计模式。 设计模式是在软件设计中常见问题的重复使用的解决方法。它们是可以让你的代码清晰易懂可重复使用度高的模版。它们也可以帮你完成一些松散的代码,你不用很麻烦就可以更改代码或者替换里面的组成部分。

1010

Swift-X-设计模式实践指南

Swift-X-设计模式实践指南 项目介绍 ???? 欢迎使用 Kingcos 的《Swift-X 设计模式》仓库!本项目以 ???? Swift 这门强大且迅速成长的语言为核心,展示了设计模式的现代实现。在这里,X 版本号代表了随着 Swift 的迭代,该项目也不断更新至最新的语言特性。作者,一名热爱 Swift 编程及iOS开发的中国大学生,通过此仓库致力于分享和解释设计模式在实际开发中的应用,帮助开发者...

gitblog_01101的博客 1172

Swift 设计模式开源项目推荐

Swift 设计模式开源项目推荐 1. 项目基础介绍及编程语言 本项目是一个开源的Swift设计模式集合,旨在为Swift开发者提供一个学习设计模式的平台。该项目以Swift编程语言为主要实现语言,包含了多种设计模式的实现和详细说明。 2. 项目的核心功能 项目的核心功能是收集并展示各种软件设计模式在Swift语言中的实现。这些设计模式包括但不限于: 行为型模式:如命令模式、解释器模式、迭代器模...

gitblog_01103的博客 306

终极Swift设计模式指南:从基础到实战的23种模式实现全解析

Swift作为Apple生态系统的核心编程语言,凭借其安全、高效和现代化的特性,已成为iOS、macOS和watchOS开发的首选。设计模式作为软件开发的经验总结,能够帮助开发者构建可维护、可扩展的Swift应用。本指南将系统介绍23种经典设计模式在Swift中的实现方式,结合awesome-swift项目中的实战案例,让你轻松掌握设计模式的精髓。 ## 为什么Swift开发者需要学习设计模式?

gitblog_02329的博客 441

高级设计模式在Swift项目中的应用

高级设计模式在Swift项目中的应用 【免费下载链接】Design-Patterns-In-Swift ???? Design Patterns implemented in Swift 5.0 项目地址: https://gitcod...

gitblog_00997的博客 318

Swift中的设计模式

这篇短文中,我们回顾了设计模式的概念,并讨论了在现代编程语言背景下,设计模式相关问题的一些变化。然后使用Swift语言演示了5个设计模式和 新的语言特性之间的关系。这5个设计模式和语言特性分别是:高阶函数和命令模式,一等函数和策略模式,柯里化函数和抽象工厂模式,扩展和适配器模式,运算 符重载和解释器模式。这5个例子展示了设计模式在现代编程语言中的变化:要么被语言特性更好的代替了;要么变得更为简单了。...

chenzoff的专栏 466

Swift设计模式实战指南

Swift设计模式实战指南 项目介绍 Swift设计模式项目(GitHub)是一个专注于教授如何在Swift编程语言中实现和应用经典及现代设计模式的开源资源库。这个项目不仅包含了设计模式的基本理论,还提供了实际可运行的代码示例,帮助开发者深入了解这些模式在实际开发中的运用,从而提升代码质量、可维护性和灵活性。 项目快速启动 要快速启动并运行这个项目,首先确保你的系统已安装了最新版本的Xcode...

gitblog_00861的博客 519

「迭代器(Iterator)」设计模式 Swift实现

迭代器模式属于设计模式中的行为型模式,它可以帮助我们在遍历聚合对象时提供一种优雅的解决方案,其核心思想在于提供一个迭代器对象,提供按照一定规则遍历聚合对象的方式。 Swift语言中,迭代器模式可以使用IteratorProtocol和Sequence两个系统协议来实现。其中IteratorProtocol协议用来定义一个迭代器,它必须实现一个next方法,该方法会返回聚合对象中的下一个元素。而Sequence协议用来定义聚合对象,并提供一个makeIterator()方法,用来生成所需的迭代器对象。

黑码哥的技术博客 1万+

设计模式在Swift开发中的最佳实践

设计模式在Swift开发中的最佳实践 【免费下载链接】Design-Patterns-In-Swift ???? Design Patterns implemented in Swift 5.0 项目地址: https://gitcod...

gitblog_00419的博客 385

Swift设计模式:面向对象与函数式的完美融合

在现代编程语言中,设计模式的实现往往局限于单一范式——要么是纯面向对象(Object-Oriented, OO)的继承层次,要么是纯函数式(Functional Programming, FP)的不可变数据流。而Swift凭借其独特的语言特性,实现了两种范式的深度融合,创造出既具备面向对象灵活性,又拥有函数式安全性的设计模式实现方案。本文将系统剖析Swift如何通过值类型(Value Type)、...

gitblog_00279的博客 410
上一篇: iOS 一个UIGestureRecognizer绑定多个view只有最后一个有效
下一篇: swift语言设计模式介绍-创建型模式
backpackcsdn
博客等级 码龄13年 0粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值