目录
?????????策略模式(Strategy Pattern)允许在运行时动态地改变算法或策略的选择,从而使算法的变化独立于使用它的客户端。这种模式通过将算法封装在单独的类中,使得它们可以相互替换,并使得它们易于理解、扩展和维护。
(1)优点:
(2)缺点:
package main
import "fmt"
// 电商系统,针对不同的用户类型(普通用户、VIP用户、超级VIP用户),希望根据用户类型来计算商品的折扣价格。
// 环境接口
type PricingContext interface {
SetStrategy(strategy PricingStrategy)
CalculatePrice(originalPrice float64) float64
}
// 抽象策略接口
type PricingStrategy interface {
CalculatePrice(originalPrice float64) float64
}
// 具体策略:普通用户策略
type RegularUserStrategy struct{}
func (s *RegularUserStrategy) CalculatePrice(originalPrice float64) float64 {
return originalPrice
}
// 具体策略:VIP用户策略
type VipUserStrategy struct{}
func (s *VipUserStrategy) CalculatePrice(originalPrice float64) float64 {
return originalPrice * 0.9
}
// 具体策略:超级VIP用户策略
type SuperVipUserStrategy struct{}
func (s *SuperVipUserStrategy) CalculatePrice(originalPrice float64) float64 {
return originalPrice * 0.8
}
// 具体环境
type PricingService struct {
strategy PricingStrategy
}
func (s *PricingService) SetStrategy(strategy PricingStrategy) {
s.strategy = strategy
}
func (s *PricingService) CalculatePrice(originalPrice float64) float64 {
return s.strategy.CalculatePrice(originalPrice)
}
// 客户端代码
func main() {
pricingService := &PricingService{}
pricingService.SetStrategy(&RegularUserStrategy{})
originalPrice := 100.0
discountedPrice := pricingService.CalculatePrice(originalPrice)
fmt.Printf("普通用户原价:%v,折扣价:%v\n", originalPrice, discountedPrice)
pricingService.SetStrategy(&VipUserStrategy{})
discountedPrice = pricingService.CalculatePrice(originalPrice)
fmt.Printf("VIP用户原价:%v,折扣价:%v\n", originalPrice, discountedPrice)
pricingService.SetStrategy(&SuperVipUserStrategy{})
discountedPrice = pricingService.CalculatePrice(originalPrice)
fmt.Printf("超级VIP用户原价:%v,折扣价:%v\n", originalPrice, discountedPrice)
}