go: Strategy Pattern

项目结构:

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Strategy Pattern 策略模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/23 22:08
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : jewelry.go
*/
package entity
 
import "fmt"
 
// Jewelry 珠宝实体,不依赖任何包
type Jewelry struct {
    Material   string
    Weight     float64
    CraftLevel int
    Brand      string
}
 
func NewJewelry(material string, weight float64, craftLevel int, brand string) *Jewelry {
    return &Jewelry{
        Material:   material,
        Weight:     weight,
        CraftLevel: craftLevel,
        Brand:      brand,
    }
}
 
// ========== 新增:显示完整珠宝信息 ==========
func (j *Jewelry) ShowJewelryInfo() {
    fmt.Println("------------------------【珠宝基础信息】------------------------")
    fmt.Println("材质    : ", j.Material)
    fmt.Println("重量    : ", j.Weight, "克")
    fmt.Println("工艺等级: ", j.CraftLevel)
    fmt.Println("品牌    : ", j.Brand)
    fmt.Println("------------------------------------------------------------------------------------------")
}
Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Strategy Pattern 策略模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/23 22:09
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : pricing.go
*/
package strategy
 
import "godesginpattern/strategy/domain/entity"
 
// PricingStrategy 定价策略顶层接口
// 职责:定义统一契约,所有策略必须实现
type PricingStrategy interface {
    Calculate(j *entity.Jewelry) float64
}
Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Strategy Pattern 策略模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/23 22:09
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : brand.go
*/
package strategy
 
import "godesginpattern/strategy/domain/entity"
 
// BrandPremiumPricing 品牌溢价定价策略
type BrandPricing struct{}
 
func (b *BrandPricing) Calculate(j *entity.Jewelry) float64 {
    base := j.Weight * 100
    switch j.Brand {
    case "高端品牌":
        return base * 3
    default:
        return base
    }
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Strategy Pattern 策略模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/23 22:09
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : craft.go
*/
package strategy
 
import "godesginpattern/strategy/domain/entity"
 
// CraftPricing 按工艺定价策略
type CraftPricing struct{}
 
func (c *CraftPricing) Calculate(j *entity.Jewelry) float64 {
    return 1000 + float64(j.CraftLevel)*500
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Strategy Pattern 策略模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/23 22:09
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : weight.go
*/
package strategy
 
import "godesginpattern/strategy/domain/entity"
 
// WeightPricing 按重量定价策略
// 职责:仅实现重量计价算法,无任何其他逻辑
type WeightPricing struct{}
 
func (w *WeightPricing) Calculate(j *entity.Jewelry) float64 {
    var unitPrice float64
    switch j.Material {
    case "黄金":
        unitPrice = 500
    case "白银":
        unitPrice = 10
    default:
        unitPrice = 50
    }
    return unitPrice * j.Weight
}
Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Strategy Pattern 策略模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/23 22:20
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : jewelry_context.go
*/
package context
 
import (
    "godesginpattern/strategy/domain/entity"
    "godesginpattern/strategy/domain/strategy"
)
 
// JewelryContext 上下文:持有实体 + 策略
// 这是策略模式标准 Context
type JewelryContext struct {
    jewelry  *entity.Jewelry
    strategy strategy.PricingStrategy
}
 
func NewJewelryContext(j *entity.Jewelry) *JewelryContext {
    return &JewelryContext{jewelry: j}
}
 
// SetStrategy 设置策略
func (c *JewelryContext) SetStrategy(s strategy.PricingStrategy) {
    c.strategy = s
}
 
// CalculatePrice 计算价格
func (c *JewelryContext) CalculatePrice() float64 {
    return c.strategy.Calculate(c.jewelry)
}

调用:

Go 复制代码
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Strategy Pattern 策略模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/23 22:22
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : strategybll.go
*/
package bll
 
import (
    "fmt"
    "godesginpattern/strategy/context"
    "godesginpattern/strategy/domain/entity"
    "godesginpattern/strategy/strategy"
)
 
func StrategyMain() {
    // 创建珠宝
    j := entity.NewJewelry("黄金", 10, 4, "高端品牌")
 
    j.ShowJewelryInfo()
    // 创建上下文
    ctx := context.NewJewelryContext(j)
 
    // 重量策略
    ctx.SetStrategy(&strategy.WeightPricing{})
    fmt.Printf("重量计价:%.2f\n", ctx.CalculatePrice())
 
    // 工艺策略
    ctx.SetStrategy(&strategy.CraftPricing{})
    fmt.Printf("工艺计价:%.2f\n", ctx.CalculatePrice())
 
    // 品牌策略
    ctx.SetStrategy(&strategy.BrandPricing{})
    fmt.Printf("品牌计价:%.2f\n", ctx.CalculatePrice())
 
    j = entity.NewJewelry("蓝宝石", 20, 5, "高端品牌")
    j.ShowJewelryInfo()
    // 创建上下文
    ctx = context.NewJewelryContext(j)
 
    // 重量策略
    ctx.SetStrategy(&strategy.WeightPricing{})
    fmt.Printf("重量计价:%.2f\n", ctx.CalculatePrice())
 
    // 工艺策略
    ctx.SetStrategy(&strategy.CraftPricing{})
    fmt.Printf("工艺计价:%.2f\n", ctx.CalculatePrice())
 
    // 品牌策略
    ctx.SetStrategy(&strategy.BrandPricing{})
    fmt.Printf("品牌计价:%.2f\n", ctx.CalculatePrice())
     
}

输出:

相关推荐
小的时候可菜了13 小时前
JS 异步的本质:从单线程到 thenable(一条进化链)
开发语言·前端·javascript
可乐鸡翅yeah_13 小时前
hls.js 配置 loadStartPosition,点播起始播放位置踩坑
开发语言·javascript·网络协议·ecmascript·m3u8在线
JWASX13 小时前
Java 转 go 学习 - 函数(1)
学习·golang
en.en..13 小时前
Linux 进程退出exit(函数)
java·开发语言·算法
Cx330❀13 小时前
【Qt 进阶指南】详解 Qt 常用标准对话框与主窗口组件架构
开发语言·qt·ui·性能优化·架构·图形渲染
Light Gao13 小时前
Encoder 与 Decoder 详解:从 Embedding 到 Seq2Seq 的完整数据流
java·开发语言·embedding
HZZD_HZZD13 小时前
弱网下CoAP还省吗?合众致达Cat.1电表90天实测:MQTT重连流量占52%、续航差距从38%拉大到73%
开发语言·物联网·php·腾讯云
web打印社区13 小时前
Windows 网页静默打印设置步骤:客户端、防火墙与联调清单
开发语言·前端·javascript·chrome·pdf·ecmascript
小师兄吃牛肉13 小时前
什么是R语言?如何快速学习R语言
开发语言·学习·r语言
Evand J14 小时前
【MATLAB例程】三维快速扩展随机树(RRT)路径规划与到达角(AOA)、到达时间差(TDOA)融合定位,附下载链接
开发语言·matlab·代码·定位·例程