MST

星途 面试题库

面试题:Go语言中接口设计模式之策略模式的实现

在Go语言中,请使用接口设计模式实现一个策略模式,假设有不同的支付方式(如支付宝支付、微信支付、银行卡支付),每种支付方式都有自己的支付逻辑。请写出实现代码,并解释代码中接口、结构体以及它们之间是如何协作来体现策略模式的。
25.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

// 支付接口
type Payment interface {
    Pay(amount float64) string
}

// 支付宝支付结构体
type AlipayPayment struct{}

func (a AlipayPayment) Pay(amount float64) string {
    return fmt.Sprintf("使用支付宝支付 %.2f 元", amount)
}

// 微信支付结构体
type WechatPayment struct{}

func (w WechatPayment) Pay(amount float64) string {
    return fmt.Sprintf("使用微信支付 %.2f 元", amount)
}

// 银行卡支付结构体
type BankCardPayment struct{}

func (b BankCardPayment) Pay(amount float64) string {
    return fmt.Sprintf("使用银行卡支付 %.2f 元", amount)
}

// 订单结构体,包含支付策略
type Order struct {
    payment Payment
}

// 设置支付策略
func (o *Order) SetPayment(payment Payment) {
    o.payment = payment
}

// 执行支付
func (o *Order) Pay(amount float64) string {
    if o.payment == nil {
        return "未设置支付方式"
    }
    return o.payment.Pay(amount)
}

代码解释

  1. 接口Payment 接口定义了 Pay 方法,它抽象了支付的行为。所有具体的支付方式(支付宝、微信、银行卡)都必须实现这个接口。这是策略模式中策略的抽象定义。
  2. 结构体
    • AlipayPaymentWechatPaymentBankCardPayment 结构体分别代表不同的支付方式。它们实现了 Payment 接口的 Pay 方法,各自包含具体的支付逻辑。这是策略模式中的具体策略实现。
    • Order 结构体包含一个 Payment 类型的字段,它持有一个支付策略实例。SetPayment 方法用于设置具体的支付策略,Pay 方法调用当前设置的支付策略的 Pay 方法来执行支付操作。这是策略模式中的上下文,它通过组合的方式使用具体策略。
  3. 协作体现策略模式
    • Order 结构体作为上下文,依赖于 Payment 接口而不是具体的支付结构体。这样,Order 可以在运行时动态地切换不同的支付策略(具体的支付结构体)。
    • 具体的支付结构体实现 Payment 接口,使得它们可以被 Order 结构体所使用。这种松耦合的设计,符合策略模式的思想,即把不同的算法(支付逻辑)封装到不同的策略类中,上下文可以根据需要选择不同的策略。