首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >go: Strategy Pattern

go: Strategy Pattern

作者头像
geovindu
发布2026-06-18 17:59:13
发布2026-06-18 17:59:13
850
举报

项目结构:

代码语言:javascript
复制
/*
# 版权所有  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("——————————————————————————————")
}
代码语言:javascript
复制
/*
# 版权所有  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
}
代码语言:javascript
复制
/*
# 版权所有  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
}
代码语言:javascript
复制
/*
# 版权所有  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)
}

调用:

代码语言:javascript
复制
/*
# 版权所有  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())
     
}

输出:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档