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

go: Adapter Pattern

作者头像
geovindu
发布2026-06-18 18:11:01
发布2026-06-18 18:11:01
1230
举报

项目结构:

结构化优势 分层明确:实体、供应商、适配器、业务完全分离 职责单一:每个文件只做一件事 易扩展:新增供应商 C,只需增加: adaptee/supplier_c.go adapter/supplier_c_adapter.go 业务零改动:service/business.go 永远不需要修改 符合设计模式最佳实践

代码语言:javascript
复制
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Adapter 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/18 20:55
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : jewelry.go
*/
package entity
 
// StandardJewelry 业务系统统一标准接口
type StandardJewelry interface {
    GetName() string
    GetWeight() float64
    GetMaterial() string
    GetCost() float64
}
 
// JewelryEntity 标准数据实体
type JewelryEntity struct {
    Name     string
    Weight   float64
    Material string
    Cost     float64
}
 
func (j *JewelryEntity) GetName() string { return j.Name }
 
func (j *JewelryEntity) GetWeight() float64 { return j.Weight }
 
func (j *JewelryEntity) GetMaterial() string { return j.Material }
 
func (j *JewelryEntity) GetCost() float64 { return j.Cost }
代码语言:javascript
复制
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Adapter 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/18 20:56
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : supplier_a.go
*/
package adaptee
 
// SupplierA 传统中文Map格式
type SupplierA struct {
    Data map[string]interface{}
}
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Adapter 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/18 20:56
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : supplier_b.go
*/
package adaptee
 
// SupplierB 国际英文结构体
type SupplierB struct {
    Name     string
    Carat    float64
    Material string
    Price    float64
}
代码语言:javascript
复制
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Adapter 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/18 20:56
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : supplier_a_adapter.go
*/
package adapter
 
import (
    "godesginpattern/adapter/adaptee"
    "godesginpattern/adapter/entity"
)
 
// SupplierAAdapter 适配A → 标准接口
type SupplierAAdapter struct {
    supplier *adaptee.SupplierA
}
 
func NewSupplierAAdapter(s *adaptee.SupplierA) entity.StandardJewelry {
    return &SupplierAAdapter{supplier: s}
}
 
func (a *SupplierAAdapter) GetName() string {
    return a.supplier.Data["名称"].(string)
}
 
// 克重 → 统一转 float64(支持 int / float64)
func (a *SupplierAAdapter) GetWeight() float64 {
    switch val := a.supplier.Data["克重"].(type) {
    case int:
        return float64(val)
    case float64:
        return val
    default:
        return 0
    }
}
 
func (a *SupplierAAdapter) GetMaterial() string {
    return a.supplier.Data["材质"].(string)
}
 
// 供货价 → 统一转 float64(支持 int / float64)
// 这里修复了 panic 问题!
func (a *SupplierAAdapter) GetCost() float64 {
    switch val := a.supplier.Data["供货价"].(type) {
    case int:
        return float64(val)
    case float64:
        return val
    default:
        return 0
    }
}
 
 
 
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Adapter 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/18 20:57
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : supplier_b_adapter.go
*/
package adapter
 
import (
    "godesginpattern/adapter/adaptee"
    "godesginpattern/adapter/entity"
)
 
// SupplierBAdapter 适配B → 标准接口
type SupplierBAdapter struct {
    supplier *adaptee.SupplierB
}
 
func NewSupplierBAdapter(s *adaptee.SupplierB) entity.StandardJewelry {
    return &SupplierBAdapter{supplier: s}
}
 
func (b *SupplierBAdapter) GetName() string     { return b.supplier.Name }
func (b *SupplierBAdapter) GetWeight() float64  { return b.supplier.Carat }
func (b *SupplierBAdapter) GetMaterial() string { return b.supplier.Material }
func (b *SupplierBAdapter) GetCost() float64    { return b.supplier.Price }
代码语言:javascript
复制
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Adapter 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/18 20:57
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : business.go
*/
package service
 
import (
    "fmt"
    "godesginpattern/adapter/entity"
)
 
// BusinessProcess 统一业务流程
func BusinessProcess(j entity.StandardJewelry) {
    fmt.Println("=== 执行业务流程 ===")
    fmt.Printf("商品:%s\n", j.GetName())
    fmt.Printf("重量:%.2f\n", j.GetWeight())
    fmt.Printf("材质:%s\n", j.GetMaterial())
    fmt.Printf("成本:%.2f\n", j.GetCost())
    fmt.Println("入库、计价、下单完成 ✅\n")
}

调用:

代码语言:javascript
复制
/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Adapter 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/18 21:02
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : adapterbll.go
 
adapter/
├── go.mod                  // Go 模块
├── entity/                 // 统一标准实体层
│   └── jewelry.go          // 标准接口 + 标准实体
├── adaptee/                // 被适配者(供应商原始接口)
│   ├── supplier_a.go       // 供应商A(中文Map)
│   └── supplier_b.go       // 供应商B(英文结构体)
├── adapter/                // 适配器层(核心转换)
│   ├── supplier_a_adapter.go
│   └── supplier_b_adapter.go
├── service/                // 业务逻辑层
│   └── business.go
└── main.go                 // 程序入口
*/
package bll
 
import (
    "godesginpattern/adapter/adaptee"
    "godesginpattern/adapter/adapter"
    "godesginpattern/adapter/service"
)
 
// 示例
func AdapterMain() {
    // 对接供应商A
    suppA := &adaptee.SupplierA{
        Data: map[string]interface{}{
            "名称":  "黄金项链",
            "克重":  5.2,
            "材质":  "足金",
            "供货价": 2800,
        },
    }
    adapterA := adapter.NewSupplierAAdapter(suppA)
    service.BusinessProcess(adapterA)
 
    // 对接供应商B
    suppB := &adaptee.SupplierB{
        Name:     "Diamond Ring",
        Carat:    0.5,
        Material: "Platinum",
        Price:    12000,
    }
    adapterB := adapter.NewSupplierBAdapter(suppB)
    service.BusinessProcess(adapterB)
} 

输出:

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

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

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

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

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