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())
     
}

输出:

相关推荐
是2的10次方啊32 分钟前
设计模式与生活②:你只管点外卖,别管堡怎么做
设计模式
CRMEB系统商城35 分钟前
家电零售的供应商协同与物流提效
java·开发语言·人工智能·小程序·1024程序员节
王大师王文峰1 小时前
Java+AI 面试题(二):业务场景设计 10 例【客服机器人、合同审查、Text2SQL、告警降噪、成本优化】场景题答法与追问链路
java·开发语言·人工智能
紧跟先前的步伐1 小时前
Go AI Agent 实战 13|大模型流式输出 Streaming 的实现
人工智能·ai·golang·1024程序员节
言乐61 小时前
Python实现三轴联动根据数据自动打磨镜片模型
开发语言·python
CHHH_HHH1 小时前
【Linux网络篇】初识网络与Socket编程基础
linux·服务器·c语言·开发语言·网络·后端·1024程序员节
jimy11 小时前
C++ 中 xvalue 的 identity 存在哪里?和 lvalue 的 identity 有什么区别?
开发语言·c++·1024程序员节
yujunl1 小时前
U9 无授权的模式WebAPI开发的总结
开发语言·1024程序员节
AIex-YH2 小时前
发酵罐里点一盏灯:光发酵,正在重算微藻蛋白的成本账
运维·制造·策略模式
zzu123zsw2 小时前
为什么 Python 做 Agent 总在并发中崩溃?拆解 Blockcell 在 Rust 下的 Host-Cell 隔离与自愈状态机
开发语言·python·rust·大模型·ai agent