| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- package main
- import "fmt"
- // ========== 接口定义 ==========
- // 支付接口 - 定义支付行为契约
- type Payment interface {
- Pay(amount float64) bool
- Refund(amount float64) bool
- GetBalance() float64
- GetProviderName() string
- }
- // ========== 结构体定义 ==========
- // 支付宝支付
- type Alipay struct {
- Account string
- Balance float64
- }
- // 微信支付
- type WechatPay struct {
- OpenID string
- Balance float64
- Frozen float64 // 冻结金额
- }
- // 银行卡支付
- type BankCard struct {
- CardNumber string
- Balance float64
- BankName string
- }
- // ========== 方法实现 - Alipay ==========
- func (a *Alipay) Pay(amount float64) bool {
- if amount <= 0 || amount > a.Balance {
- fmt.Printf("支付宝支付失败!金额: %.2f, 余额: %.2f\n", amount, a.Balance)
- return false
- }
- a.Balance -= amount
- fmt.Printf("支付宝支付成功!扣款: %.2f, 剩余余额: %.2f\n", amount, a.Balance)
- return true
- }
- func (a *Alipay) Refund(amount float64) bool {
- if amount <= 0 {
- return false
- }
- a.Balance += amount
- fmt.Printf("支付宝退款成功!退款: %.2f, 当前余额: %.2f\n", amount, a.Balance)
- return true
- }
- func (a Alipay) GetBalance() float64 {
- return a.Balance
- }
- func (a Alipay) GetProviderName() string {
- return "支付宝"
- }
- // ========== 方法实现 - WechatPay ==========
- func (w *WechatPay) Pay(amount float64) bool {
- available := w.Balance - w.Frozen
- if amount <= 0 || amount > available {
- fmt.Printf("微信支付失败!金额: %.2f, 可用余额: %.2f\n", amount, available)
- return false
- }
- w.Balance -= amount
- fmt.Printf("微信支付成功!扣款: %.2f, 剩余余额: %.2f\n", amount, w.Balance)
- return true
- }
- func (w *WechatPay) Refund(amount float64) bool {
- if amount <= 0 {
- return false
- }
- w.Balance += amount
- fmt.Printf("微信退款成功!退款: %.2f, 当前余额: %.2f\n", amount, w.Balance)
- return true
- }
- func (w WechatPay) GetBalance() float64 {
- return w.Balance
- }
- func (w WechatPay) GetProviderName() string {
- return "微信支付"
- }
- // 微信特有方法(不在接口中)
- func (w *WechatPay) FreezeAmount(amount float64) {
- w.Frozen += amount
- fmt.Printf("冻结金额: %.2f, 总冻结: %.2f\n", amount, w.Frozen)
- }
- func (w *WechatPay) UnfreezeAmount(amount float64) {
- if amount <= w.Frozen {
- w.Frozen -= amount
- fmt.Printf("解冻金额: %.2f, 剩余冻结: %.2f\n", amount, w.Frozen)
- }
- }
- // ========== 方法实现 - BankCard ==========
- func (b *BankCard) Pay(amount float64) bool {
- if amount <= 0 || amount > b.Balance {
- fmt.Printf("银行卡支付失败!金额: %.2f, 余额: %.2f\n", amount, b.Balance)
- return false
- }
- b.Balance -= amount
- fmt.Printf("银行卡支付成功!扣款: %.2f, 剩余余额: %.2f\n", amount, b.Balance)
- return true
- }
- func (b *BankCard) Refund(amount float64) bool {
- if amount <= 0 {
- return false
- }
- b.Balance += amount
- fmt.Printf("银行卡退款成功!退款: %.2f, 当前余额: %.2f\n", amount, b.Balance)
- return true
- }
- func (b BankCard) GetBalance() float64 {
- return b.Balance
- }
- func (b BankCard) GetProviderName() string {
- return b.BankName + "银行卡"
- }
- // ========== 工具函数(使用接口) ==========
- // 处理支付 - 接受任何实现 Payment 接口的类型
- func ProcessPayment(p Payment, amount float64) bool {
- fmt.Printf("\n开始处理支付...\n")
- fmt.Printf("支付方式: %s\n", p.GetProviderName())
- fmt.Printf("当前余额: %.2f\n", p.GetBalance())
- success := p.Pay(amount)
- if success {
- fmt.Printf("✅ 支付处理完成\n")
- } else {
- fmt.Printf("❌ 支付处理失败\n")
- }
- return success
- }
- // 批量支付处理
- func ProcessBatchPayments(payments []Payment, amount float64) {
- fmt.Printf("\n=== 批量支付处理 ===\n")
- successCount := 0
- for i, payment := range payments {
- fmt.Printf("\n第 %d 笔支付:\n", i+1)
- if ProcessPayment(payment, amount) {
- successCount++
- }
- }
- fmt.Printf("\n批量支付结果: 成功 %d/%d\n", successCount, len(payments))
- }
- // 检查支付方式状态
- func CheckPaymentStatus(payments []Payment) {
- fmt.Printf("\n=== 支付方式状态检查 ===\n")
- for i, payment := range payments {
- fmt.Printf("%d. %s - 余额: %.2f\n",
- i+1, payment.GetProviderName(), payment.GetBalance())
- }
- }
- func main() {
- fmt.Println("=== 支付系统演示 ===\n")
- // 创建不同的支付实例
- alipay := &Alipay{Account: "zhangsan@alipay.com", Balance: 1000.0}
- wechat := &WechatPay{OpenID: "wx123456", Balance: 800.0}
- bankcard := &BankCard{CardNumber: "622588******1234", Balance: 5000.0, BankName: "招商银行"}
- // 演示微信特有方法
- wechat.FreezeAmount(200.0)
- // 将不同支付方式放入接口切片(多态)
- payments := []Payment{alipay, wechat, bankcard}
- // 1. 检查状态
- CheckPaymentStatus(payments)
- // 2. 单笔支付处理
- fmt.Println("\n=== 单笔支付演示 ===")
- ProcessPayment(alipay, 150.0)
- ProcessPayment(wechat, 100.0) // 注意:微信有冻结金额
- // 3. 批量支付处理
- ProcessBatchPayments(payments, 50.0)
- // 4. 退款演示
- fmt.Println("\n=== 退款演示 ===")
- alipay.Refund(50.0)
- wechat.Refund(30.0)
- // 5. 最终状态检查
- CheckPaymentStatus(payments)
- // 6. 类型断言演示:访问具体类型的特有方法
- fmt.Println("\n=== 类型断言访问特有方法 ===")
- for _, payment := range payments {
- // 检查是否是 WechatPay 类型
- if wechatPay, ok := payment.(*WechatPay); ok {
- fmt.Printf("发现微信支付,冻结金额: %.2f\n", wechatPay.Frozen)
- wechatPay.UnfreezeAmount(100.0) // 解冻部分金额
- }
- }
- // 7. 类型切换演示
- fmt.Println("\n=== 类型切换演示 ===")
- for i, payment := range payments {
- switch p := payment.(type) {
- case *Alipay:
- fmt.Printf("%d. 支付宝账户: %s\n", i+1, p.Account)
- case *WechatPay:
- fmt.Printf("%d. 微信OpenID: %s, 冻结金额: %.2f\n", i+1, p.OpenID, p.Frozen)
- case *BankCard:
- fmt.Printf("%d. 银行卡号: %s\n", i+1, p.CardNumber)
- default:
- fmt.Printf("%d. 未知支付类型\n", i+1)
- }
- }
- }
|