main.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. package main
  2. import "fmt"
  3. // ========== 接口定义 ==========
  4. // 支付接口 - 定义支付行为契约
  5. type Payment interface {
  6. Pay(amount float64) bool
  7. Refund(amount float64) bool
  8. GetBalance() float64
  9. GetProviderName() string
  10. }
  11. // ========== 结构体定义 ==========
  12. // 支付宝支付
  13. type Alipay struct {
  14. Account string
  15. Balance float64
  16. }
  17. // 微信支付
  18. type WechatPay struct {
  19. OpenID string
  20. Balance float64
  21. Frozen float64 // 冻结金额
  22. }
  23. // 银行卡支付
  24. type BankCard struct {
  25. CardNumber string
  26. Balance float64
  27. BankName string
  28. }
  29. // ========== 方法实现 - Alipay ==========
  30. func (a *Alipay) Pay(amount float64) bool {
  31. if amount <= 0 || amount > a.Balance {
  32. fmt.Printf("支付宝支付失败!金额: %.2f, 余额: %.2f\n", amount, a.Balance)
  33. return false
  34. }
  35. a.Balance -= amount
  36. fmt.Printf("支付宝支付成功!扣款: %.2f, 剩余余额: %.2f\n", amount, a.Balance)
  37. return true
  38. }
  39. func (a *Alipay) Refund(amount float64) bool {
  40. if amount <= 0 {
  41. return false
  42. }
  43. a.Balance += amount
  44. fmt.Printf("支付宝退款成功!退款: %.2f, 当前余额: %.2f\n", amount, a.Balance)
  45. return true
  46. }
  47. func (a Alipay) GetBalance() float64 {
  48. return a.Balance
  49. }
  50. func (a Alipay) GetProviderName() string {
  51. return "支付宝"
  52. }
  53. // ========== 方法实现 - WechatPay ==========
  54. func (w *WechatPay) Pay(amount float64) bool {
  55. available := w.Balance - w.Frozen
  56. if amount <= 0 || amount > available {
  57. fmt.Printf("微信支付失败!金额: %.2f, 可用余额: %.2f\n", amount, available)
  58. return false
  59. }
  60. w.Balance -= amount
  61. fmt.Printf("微信支付成功!扣款: %.2f, 剩余余额: %.2f\n", amount, w.Balance)
  62. return true
  63. }
  64. func (w *WechatPay) Refund(amount float64) bool {
  65. if amount <= 0 {
  66. return false
  67. }
  68. w.Balance += amount
  69. fmt.Printf("微信退款成功!退款: %.2f, 当前余额: %.2f\n", amount, w.Balance)
  70. return true
  71. }
  72. func (w WechatPay) GetBalance() float64 {
  73. return w.Balance
  74. }
  75. func (w WechatPay) GetProviderName() string {
  76. return "微信支付"
  77. }
  78. // 微信特有方法(不在接口中)
  79. func (w *WechatPay) FreezeAmount(amount float64) {
  80. w.Frozen += amount
  81. fmt.Printf("冻结金额: %.2f, 总冻结: %.2f\n", amount, w.Frozen)
  82. }
  83. func (w *WechatPay) UnfreezeAmount(amount float64) {
  84. if amount <= w.Frozen {
  85. w.Frozen -= amount
  86. fmt.Printf("解冻金额: %.2f, 剩余冻结: %.2f\n", amount, w.Frozen)
  87. }
  88. }
  89. // ========== 方法实现 - BankCard ==========
  90. func (b *BankCard) Pay(amount float64) bool {
  91. if amount <= 0 || amount > b.Balance {
  92. fmt.Printf("银行卡支付失败!金额: %.2f, 余额: %.2f\n", amount, b.Balance)
  93. return false
  94. }
  95. b.Balance -= amount
  96. fmt.Printf("银行卡支付成功!扣款: %.2f, 剩余余额: %.2f\n", amount, b.Balance)
  97. return true
  98. }
  99. func (b *BankCard) Refund(amount float64) bool {
  100. if amount <= 0 {
  101. return false
  102. }
  103. b.Balance += amount
  104. fmt.Printf("银行卡退款成功!退款: %.2f, 当前余额: %.2f\n", amount, b.Balance)
  105. return true
  106. }
  107. func (b BankCard) GetBalance() float64 {
  108. return b.Balance
  109. }
  110. func (b BankCard) GetProviderName() string {
  111. return b.BankName + "银行卡"
  112. }
  113. // ========== 工具函数(使用接口) ==========
  114. // 处理支付 - 接受任何实现 Payment 接口的类型
  115. func ProcessPayment(p Payment, amount float64) bool {
  116. fmt.Printf("\n开始处理支付...\n")
  117. fmt.Printf("支付方式: %s\n", p.GetProviderName())
  118. fmt.Printf("当前余额: %.2f\n", p.GetBalance())
  119. success := p.Pay(amount)
  120. if success {
  121. fmt.Printf("✅ 支付处理完成\n")
  122. } else {
  123. fmt.Printf("❌ 支付处理失败\n")
  124. }
  125. return success
  126. }
  127. // 批量支付处理
  128. func ProcessBatchPayments(payments []Payment, amount float64) {
  129. fmt.Printf("\n=== 批量支付处理 ===\n")
  130. successCount := 0
  131. for i, payment := range payments {
  132. fmt.Printf("\n第 %d 笔支付:\n", i+1)
  133. if ProcessPayment(payment, amount) {
  134. successCount++
  135. }
  136. }
  137. fmt.Printf("\n批量支付结果: 成功 %d/%d\n", successCount, len(payments))
  138. }
  139. // 检查支付方式状态
  140. func CheckPaymentStatus(payments []Payment) {
  141. fmt.Printf("\n=== 支付方式状态检查 ===\n")
  142. for i, payment := range payments {
  143. fmt.Printf("%d. %s - 余额: %.2f\n",
  144. i+1, payment.GetProviderName(), payment.GetBalance())
  145. }
  146. }
  147. func main() {
  148. fmt.Println("=== 支付系统演示 ===\n")
  149. // 创建不同的支付实例
  150. alipay := &Alipay{Account: "zhangsan@alipay.com", Balance: 1000.0}
  151. wechat := &WechatPay{OpenID: "wx123456", Balance: 800.0}
  152. bankcard := &BankCard{CardNumber: "622588******1234", Balance: 5000.0, BankName: "招商银行"}
  153. // 演示微信特有方法
  154. wechat.FreezeAmount(200.0)
  155. // 将不同支付方式放入接口切片(多态)
  156. payments := []Payment{alipay, wechat, bankcard}
  157. // 1. 检查状态
  158. CheckPaymentStatus(payments)
  159. // 2. 单笔支付处理
  160. fmt.Println("\n=== 单笔支付演示 ===")
  161. ProcessPayment(alipay, 150.0)
  162. ProcessPayment(wechat, 100.0) // 注意:微信有冻结金额
  163. // 3. 批量支付处理
  164. ProcessBatchPayments(payments, 50.0)
  165. // 4. 退款演示
  166. fmt.Println("\n=== 退款演示 ===")
  167. alipay.Refund(50.0)
  168. wechat.Refund(30.0)
  169. // 5. 最终状态检查
  170. CheckPaymentStatus(payments)
  171. // 6. 类型断言演示:访问具体类型的特有方法
  172. fmt.Println("\n=== 类型断言访问特有方法 ===")
  173. for _, payment := range payments {
  174. // 检查是否是 WechatPay 类型
  175. if wechatPay, ok := payment.(*WechatPay); ok {
  176. fmt.Printf("发现微信支付,冻结金额: %.2f\n", wechatPay.Frozen)
  177. wechatPay.UnfreezeAmount(100.0) // 解冻部分金额
  178. }
  179. }
  180. // 7. 类型切换演示
  181. fmt.Println("\n=== 类型切换演示 ===")
  182. for i, payment := range payments {
  183. switch p := payment.(type) {
  184. case *Alipay:
  185. fmt.Printf("%d. 支付宝账户: %s\n", i+1, p.Account)
  186. case *WechatPay:
  187. fmt.Printf("%d. 微信OpenID: %s, 冻结金额: %.2f\n", i+1, p.OpenID, p.Frozen)
  188. case *BankCard:
  189. fmt.Printf("%d. 银行卡号: %s\n", i+1, p.CardNumber)
  190. default:
  191. fmt.Printf("%d. 未知支付类型\n", i+1)
  192. }
  193. }
  194. }