当前位置:   article > 正文

Golang:设计模式之策略模式

Golang:设计模式之策略模式
小小的需求

获取一个csgo饰品的定价,需要从多个渠道(steam、buff、igxe……)等等。

需求很简单,下班前搞定吧。

开工

1、先定义一个传输对象:dto.go

  1. package price
  2. type GetPriceReq struct {
  3. GoodsId int64 `json:"goods_id"`
  4. }

2、具体实现:interface.go

  1. package price
  2. import (
  3. "context"
  4. "strings"
  5. )
  6. // GoodsStrategyPrice 饰品定价策略
  7. type GoodsStrategyPrice interface {
  8. // GetPrice 根据饰品ID获取系统自定义价格
  9. GetPrice(ctx context.Context, req *GetPriceReq) int64
  10. }
  11. // GoodsStrategy 用于选择和执行策略
  12. type GoodsStrategy struct {
  13. strategy GoodsStrategyPrice
  14. }
  15. // SetStrategy 选择策略
  16. func (s *GoodsStrategy) SetStrategy(strategy GoodsStrategyPrice) {
  17. s.strategy = strategy
  18. }
  19. // GetPrice 执行策略
  20. func (s *GoodsStrategy) GetPrice(ctx context.Context, req *GetPriceReq) int64 {
  21. return s.strategy.GetPrice(ctx, req)
  22. }
  23. // GetPriceByGoods 根据策略获取价格
  24. func GetPriceByGoods(ctx context.Context, req *GetPriceReq, strategy string) int64 {
  25. // 策略
  26. var strategyObj GoodsStrategyPrice
  27. // 去除空格、转小写
  28. strategy = strings.ToLower(strings.TrimSpace(strategy))
  29. switch strategy {
  30. case "steam":
  31. strategyObj = NewGoodsSteamPrice()
  32. case "buff":
  33. strategyObj = NewGoodsBuffPrice()
  34. case "igxe":
  35. strategyObj = NewGoodsIgxePrice()
  36. default: // 默认策略
  37. strategyObj = NewGoodsSteamPrice()
  38. }
  39. obj := &GoodsStrategy{}
  40. obj.SetStrategy(strategyObj)
  41. return obj.GetPrice(ctx, req)
  42. }
  43. // GoodsSteamPrice Steam定价
  44. type GoodsSteamPrice struct{}
  45. // NewGoodsSteamPrice 定价策略:Steam定价
  46. func NewGoodsSteamPrice() *GoodsSteamPrice {
  47. return &GoodsSteamPrice{}
  48. }
  49. // GetPrice 根据饰品ID获取系统自定义价格:Steam定价
  50. func (p *GoodsSteamPrice) GetPrice(ctx context.Context, req *GetPriceReq) int64 {
  51. return 100
  52. }
  53. // GoodsBuffPrice Buff定价
  54. type GoodsBuffPrice struct{}
  55. // NewGoodsBuffPrice 定价策略: Buff定价
  56. func NewGoodsBuffPrice() *GoodsBuffPrice {
  57. return &GoodsBuffPrice{}
  58. }
  59. // GetPrice 根据饰品ID获取系统自定义价格:Buff定价
  60. func (p *GoodsBuffPrice) GetPrice(ctx context.Context, req *GetPriceReq) int64 {
  61. return 200
  62. }
  63. // GoodsIgxePrice Igxe定价
  64. type GoodsIgxePrice struct{}
  65. // NewGoodsIgxePrice 定价策略: Igxe定价
  66. func NewGoodsIgxePrice() *GoodsIgxePrice {
  67. return &GoodsIgxePrice{}
  68. }
  69. // GetPrice 根据饰品ID获取系统自定义价格:Igxe定价
  70. func (p *GoodsIgxePrice) GetPrice(ctx context.Context, req *GetPriceReq) int64 {
  71. return 300
  72. }
运行一下

是骡子是马,拉出来溜溜

  1. package main
  2. import (
  3. "fmt"
  4. "strategy/price"
  5. )
  6. func main() {
  7. strategy := "steam"
  8. priceData := price.GetPriceByGoods(nil, &price.GetPriceReq{GoodsId: 1}, strategy)
  9. fmt.Printf("策略:%s 定价:%d\n", strategy, priceData)
  10. }

输出结果:

一气呵成,还真能运行起来,这你受得了嘛 


解释一下

这段代码展示了策略模式(Strategy Pattern)的设计思想。策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。

以下是策略模式的关键组件在代码中的体现:

  1. 策略接口 (GoodsStrategyPrice): 定义了所有支持的策略或行为的公共接口。在这个例子中,接口声明了一个方法 GetPrice,用于根据饰品ID获取系统自定义价格。
  2. 具体策略类 (GoodsSteamPrice, GoodsBuffPrice, GoodsIgxePrice): 这些类实现了GoodsStrategyPrice接口,每种都代表了一种具体的定价策略。例如,GoodsSteamPrice 类的 GetPrice 方法返回100,模拟了Steam平台的定价规则。
  3. 上下文类 (GoodsStrategy): 此类用来封装使用哪种策略的上下文,并且提供了设置策略(SetStrategy)和执行策略(GetPrice)的方法。它持有一个GoodsStrategyPrice类型的策略对象,使得在运行时可以动态切换策略。
  4. 策略选择函数 (GetPriceByGoods): 这个函数根据传入的策略字符串参数,选择并实例化相应的策略对象,然后通过GoodsStrategy来执行选定的策略,获取价格。

通过这种方式,该设计允许程序在运行时选择不同的算法或策略来处理同一类型的问题,而无需知道具体策略是如何实现的,提高了代码的灵活性和可扩展性。如果未来需要添加新的定价策略,只需实现GoodsStrategyPrice接口并相应地修改策略选择逻辑即可。



我为人人,人人为我,美美与共,天下大同。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/708449
推荐阅读
  

闽ICP备14008679号