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

输出:

相关推荐
yume_sibai16 分钟前
03-Rust 函数式编程特性(闭包 + Iterator + Option/Result + 链式调用)
开发语言·后端·rust
奈斯先生Vector27 分钟前
AIGC 视频生成实战:用 Kling Video 拆解文生视频、图生视频与完整工作流
开发语言·人工智能·windows·python·aigc·音视频
小玮看世界31 分钟前
[Python]螺旋遍历 vs 最短路径:方向控制类算法的“同源异流”
开发语言·python·算法
OPEN-F42 分钟前
ROS2系列教程:tf2坐标变换详解(C++/Python)
开发语言·c++·python
XR1234567881 小时前
医院基础网络改造升级选型深度解析
开发语言·网络·php
reasonsummer1 小时前
【办公类-146-05】20260901《一分园、二分园四大教育》(优化版:标题excle+复制AI文字+Python占位符录入)
开发语言·数据库·c#
名字还没想好☜1 小时前
Go 标准库 flag 包实战:参数解析、子命令、自定义 Value 类型与默认值
开发语言·后端·golang·go
公爵爱学习1 小时前
无人机定点飞行-介绍
开发语言·图像处理·python·学习·线性回归·无人机
西西弗Sisyphus1 小时前
Qt 分类导航区的实现
开发语言·qt
zhanghaha13142 小时前
Python进阶教程:27_subprocess 模块 零基础超详细教程
开发语言·python