Menu
CoddyTech

回顾:支付处理器

本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 46 课,共 107 课。

challenge icon

挑战

简单

让我们构建一个完整的支付处理系统,将本章中的所有多态概念结合起来。你将创建不同的支付方式,让它们通过统一的接口工作;创建一个通过依赖注入接受任意支付方式的处理器;并通过多态集合处理多笔支付。

你将把代码分成 4 个文件:

  • payment.go:定义一个 PaymentMethod 接口,该接口要求实现 Process(amount float64) string 方法。这是所有支付类型都必须满足的约定。
  • methods.go:创建 3 种支付类型,每种都实现 PaymentMethod 接口:
    • CreditCard,包含 CardNumber(string)和 HolderName(string)字段。它的 Process 方法返回 Credit Card [last 4 digits of CardNumber] charged $[amount] to [HolderName]
    • PayPal,包含一个 Email 字段。它的 Process 方法返回 PayPal payment of $[amount] from [Email]
    • BankTransfer,包含 BankName 和 AccountNumber 字段。它的 Process 方法返回 Bank transfer of $[amount] via [BankName] (***[last 3 digits of AccountNumber])
  • processor.go:创建一个 PaymentProcessor 结构体,用于保存一个 PaymentMethod(注入的依赖)。添加一个构造函数 NewPaymentProcessor,接受一个 PaymentMethod。添加一个方法 ExecutePayment(amount float64) string,将调用委托给注入的支付方式。还要创建一个函数 ProcessAll(payments []PaymentMethod, amount float64) []string,通过切片中的每种支付方式处理相同金额,并返回所有结果。
  • main.go:从输入中读取支付详情,创建全部 3 种支付类型,并演示依赖注入和多态集合。首先,将信用卡传给 NewPaymentProcessor 并执行一笔支付。然后,将全部 3 种支付方式收集到一个切片中,并使用 ProcessAll 以第二个金额处理它们。将每个结果分别打印在一行。

将提供以下输入:

  • 第 1 行:信用卡号(例如,4532015112830366)
  • 第 2 行:持卡人姓名
  • 第 3 行:PayPal 电子邮箱
  • 第 4 行:银行名称
  • 第 5 行:账号(例如,987654321)
  • 第 6 行:第一笔支付金额(用于单笔处理)
  • 第 7 行:第二笔支付金额(用于批量处理)

金额格式保留两位小数。例如,输入 4532015112830366、John Smith、john@email.com、Chase、987654321、99.99 和 50 时,输出应为:

Credit Card 0366 charged $99.99 to John Smith
Credit Card 0366 charged $50.00 to John Smith
PayPal payment of $50.00 from john@email.com
Bank transfer of $50.00 via Chase (***321)

第一行显示通过注入的处理器完成的单笔支付。接下来的三行显示通过多态集合完成的批量处理:同一个 ProcessAll 函数以统一的方式处理所有支付类型,展示了接口如何让支付系统更灵活、更易扩展。

亲手试试

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// 读取输入
	cardNumber, _ := reader.ReadString('\n')
	cardNumber = strings.TrimSpace(cardNumber)

	holderName, _ := reader.ReadString('\n')
	holderName = strings.TrimSpace(holderName)

	email, _ := reader.ReadString('\n')
	email = strings.TrimSpace(email)

	bankName, _ := reader.ReadString('\n')
	bankName = strings.TrimSpace(bankName)

	accountNumber, _ := reader.ReadString('\n')
	accountNumber = strings.TrimSpace(accountNumber)

	amount1Str, _ := reader.ReadString('\n')
	amount1Str = strings.TrimSpace(amount1Str)
	amount1, _ := strconv.ParseFloat(amount1Str, 64)

	amount2Str, _ := reader.ReadString('\n')
	amount2Str = strings.TrimSpace(amount2Str)
	amount2, _ := strconv.ParseFloat(amount2Str, 64)

	// TODO:创建三种支付类型(CreditCard、PayPal、BankTransfer)

	// TODO:使用 NewPaymentProcessor 和信用卡创建一个 PaymentProcessor
	// 然后用 amount1 执行一次支付,并打印结果

	// TODO:创建一个包含这三种支付类型的 PaymentMethod 切片

	// TODO:使用 ProcessAll 和 amount2 处理所有支付
	// 并将每个结果单独打印在一行
}

面向对象编程中的所有课

自己练习: Go 在线编译器