回顾:支付处理器
本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 46 课,共 107 课。
挑战
简单让我们构建一个完整的支付处理系统,将本章中的所有多态概念结合起来。你将创建不同的支付方式,让它们通过统一的接口工作;创建一个通过依赖注入接受任意支付方式的处理器;并通过多态集合处理多笔支付。
你将把代码分成 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 在线编译器