文章目录

  • Go语言中的组合式接口设计模式
    • 背景和需求
    • 组合式接口设计

Go语言中的组合式接口设计模式

背景和需求

在微服务架构和复杂业务系统中,我们经常需要调用多个外部服务或内部模块。传统的做法是将所有方法都放在一个大接口中,但这种设计会导致接口臃肿、职责不清。今天我们来探讨一种更优雅的设计模式:组合式接口设计。

问题场景
假设我们正在开发一个电商系统,需要集成多个服务:

  • 支付服务:处理支付、退款等
  • 物流服务:查询物流、发货等
  • 用户服务:用户信息管理
  • 商品服务:商品信息管理

传统设计的问题

// 传统的混合接口设计(不推荐)
type ExternalAPI interface {// 支付相关CreatePayment(ctx context.Context, order *Order) (*Payment, error)RefundPayment(ctx context.Context, paymentID string) error// 物流相关CreateShipment(ctx context.Context, order *Order) (*Shipment, error)TrackShipment(ctx context.Context, trackingID string) (*TrackingInfo, error)// 用户相关GetUserProfile(ctx context.Context, userID string) (*User, error)UpdateUserProfile(ctx context.Context, user *User) error// 商品相关GetProductInfo(ctx context.Context, productID string) (*Product, error)UpdateProductStock(ctx context.Context, productID string, stock int) error
}

传统方式:

// 不清楚这些方法来自哪个服务
api.CreatePayment(ctx, order)
api.TrackShipment(ctx, trackingID)
api.GetUserProfile(ctx, userID)

组合式接口设计

// 主接口:服务聚合器
type ExternalAPI interface {Payment() PaymentServiceLogistics() LogisticsServiceUser() UserServiceProduct() ProductService
}// 支付服务接口
type PaymentService interface {CreatePayment(ctx context.Context, order *Order) (*Payment, error)RefundPayment(ctx context.Context, paymentID string) errorGetPaymentStatus(ctx context.Context, paymentID string) (*PaymentStatus, error)
}// 物流服务接口
type LogisticsService interface {CreateShipment(ctx context.Context, order *Order) (*Shipment, error)TrackShipment(ctx context.Context, trackingID string) (*TrackingInfo, error)CancelShipment(ctx context.Context, shipmentID string) error
}// 用户服务接口
type UserService interface {GetUserProfile(ctx context.Context, userID string) (*User, error)UpdateUserProfile(ctx context.Context, user *User) errorGetUserOrders(ctx context.Context, userID string) ([]*Order, error)
}// 商品服务接口
type ProductService interface {GetProductInfo(ctx context.Context, productID string) (*Product, error)UpdateProductStock(ctx context.Context, productID string, stock int) errorSearchProducts(ctx context.Context, query string) ([]*Product, error)
}

组合式设计:

// 清晰的服务边界和调用意图
api.Payment().CreatePayment(ctx, order)
api.Logistics().TrackShipment(ctx, trackingID)
api.User().GetUserProfile(ctx, userID)

通过这种设计,我们不仅提高了代码的可维护性,还让团队协作变得更加高效——每个开发者都能清楚地知道自己在调用哪个服务的哪个功能。

接口定义改变:从混合接口变为组合接口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88877.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88877.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88877.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React - createPortal

什么是createPortal&#xff1f;注意这是一个API&#xff0c;不是组件&#xff0c;他的作用是&#xff1a;将一个组件渲染到DOM的任意位置&#xff0c;跟Vue的Teleport组件类似。用法 import { createPortal } from react-dom;const App () > {return createPortal(<div…

Cursor的使用

Cursor的使用 Ctrl L 打开历史对话记录 Tab智能助手 1.单行/多行补全 已有代码片段&#xff1a; //需求&#xff1a;写一个工具类计算数组平均值 public class ArrayUtils {//按tab会完成补全 }按tab键- Cursor 自动生成代码: //需求&#xff1a;写一个工具类计算数组平均值 p…

17.使用DenseNet网络进行Fashion-Mnist分类

17.1 DenseNet网络结构设计import torch from torch import nn from torchsummary import summary #卷积层 def conv_block(input_channels,num_channels):netnn.Sequential(nn.BatchNorm2d(input_channels),nn.ReLU(),nn.Conv2d(input_channels,num_channels,kernel_size3,pad…

网安系列【16】之Weblogic和jboss漏洞

文章目录一 Weblogic1.1 Weblogic相关漏洞1.2 Weblogic漏洞发现1.3 Weblogic漏洞利用二 Jboss2.1 Jboss漏洞2.2 Jboss识别与漏洞利用一 Weblogic WebLogic 是由 Oracle公司 开发的一款基于Java EE&#xff08;现称Jakarta EE&#xff09;的企业级应用服务器&#xff0c;主要用…

Unity URP + XR 自定义 Skybox 在真机变黑问题全解析与解决方案(支持 Pico、Quest 等一体机)

在使用 Unity 的 URP 渲染管线开发 XR 应用&#xff08;如 Pico Neo、Pico 4、Quest 2/3 等一体机&#xff09;时&#xff0c;很多开发者遇到一个奇怪的问题&#xff1a;打包后&#xff0c;Skybox&#xff08;天空盒&#xff09;在某些角度下突然变黑&#xff0c;只在转动头部后…

Cursor、飞算JavaAI、GitHub Copilot、Gemini CLI 等热门 AI 开发工具合集

Cursor&#xff1a;代码编写的智能伙伴​Cursor 是 Anysphere 公司推出的一款 AI 编程工具&#xff0c;它基于微软开源代码编辑器 VS Code 开发&#xff0c;将 AI 技术深度整合到开发人员的工作流程中。Cursor 的功能十分强大&#xff0c;不仅能够自动用纯英文编写代码&#xf…

如何安装历史版本或指定版本的 git

背景 有的时候&#xff0c;我们需要安装指定版本的git&#xff0c;或者希望旧一点的&#xff0c;毕竟我就遇到最新的2.50.1在win10安装后打开就一闪而过&#xff0c;而安装2.49.1就不会 下载 官网可能比较难找&#xff0c;但是这个github仓库&#xff1a;https://github.com/gi…

LaCo: Large Language Model Pruning via Layer Collapse

发表&#xff1a;EMNLP_FINDING_2024 机构&#xff1a;Shanghai Jiao Tong University 连接&#xff1a;LaCo: Large Language Model Pruning via Layer Collapse - ACL Anthology 代码&#xff1a;https://github.com/yangyifei729/LaCo Abstract 基于 Transformer 的大语…

服务器内核级故障排查

目录 **检查内核级故障(Oops/Panic)的具体操作步骤****1. 查看完整 `dmesg` 日志(含时间戳)****2. 过滤关键错误信息****3. 检查系统日志中的内核消息****4. 分析最近一次启动的日志****5. 检查是否有 `vmcore` 转储文件****常见内核错误示例及含义**补充说明:检查内核级故…

Flink学习笔记:整体架构

开一个新坑&#xff0c;系统性的学习下 Flink&#xff0c;计划从整体架构到核心概念再到调优方法&#xff0c;最后是相关源码的阅读。 今天就来学习 Flink 整体架构&#xff0c;我们先看官网的架构图图中包含三部分&#xff0c;分别是 Client、JobManager 和 TaskManager。其中…

【LeetCode 热题 100】105. 从前序与中序遍历序列构造二叉树——(解法二)O(n)

Problem: 105. 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 【LeetCode 热题 100】105. 从前序与中序遍历序列构…

完美卸载 Ubuntu 双系统:从规划到实施的完整指南

&#x1f4d6; 前言 最近成功完成了一次 Ubuntu 双系统的完整卸载&#xff0c;从最初的分区删除到最终解决 GRUB 引导问题&#xff0c;整个过程虽然有些曲折&#xff0c;但最终完美解决。本文将详细分享整个卸载过程&#xff0c;希望能帮助到有类似需求的朋友。 &#x1f3af…

深入理解oracle ADG和RAC

1. 引言 本节详细介绍oracle ADG和RAC。当然这里讲得的详细是相对理论的深入&#xff0c;不涉及到实验&#xff0c;比如ADG和RAC的搭建及调优等。 RAC (Real Application Clusters) 和 ADG (Active Data Guard)是Oracle 的两大核心高可用和灾备技术。它们是 Oracle 数据库高可用…

网络安全实践:从环境搭建到漏洞复现

要求&#xff1a;1.搭建docker2.使用小皮面板搭建pikachu靶场3.使用BP的爆破模块破解pikachu的登陆密码步骤4.Kail的msf复现永恒之蓝一.搭建docker1. Docker介绍Docker 是容器&#xff0c;可以部分完全封闭。封闭意味&#xff1a;一个物质&#xff08;放到容器&#xff09;&…

车载诊断架构 --- 诊断功能开发流程

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

mysql数据库知识

MySQL数据库详解MySQL是目前全球最流行的关系型数据库管理系统之一&#xff0c;以其开源免费、高效稳定、易于扩展等特点&#xff0c;被广泛应用于Web开发、企业级应用等场景。本文将从基础概念、核心特性到实际应用&#xff0c;对MySQL进行全面解析。一、MySQL的基本概念1. 关…

基于springboot的美食文化和旅游推广系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

Rust赋能文心大模型4.5智能开发

文心大模型4.5版本概论 文心大模型4.5是百度推出的最新一代大规模预训练语言模型,属于文心大模型(ERNIE)系列。该模型在自然语言处理(NLP)、多模态理解与生成等领域表现出色,广泛应用于智能搜索、内容创作、对话交互等场景。 核心能力 语言理解与生成 支持复杂语义理解…

前端抓包(不启动前端项目就能进行后端调试)--whistle

1、安装 1.1.安装node.js 1.2.安装whistle npm install -g whistle2.安装浏览器插件【SwitchyOmega】在谷歌浏览器应用商店下载安装即可配置proxy127.0.0.1:8989是w2 start的端口号启用代理3.启动服务&#xff08;每次抓包都得启动&#xff09; w2 start点击链接访问网页 http:…

kettle从入门到精通 第102课 ETL之kettle xxl-job调度kettle的两种方式

之前我们一起学习过xxl-job调度carte&#xff0c;采用的xxl-job执行器方式&#xff0c;不了解的可以查看《kettle从入门到精通 第六十一课 ETL之kettle 任务调度器&#xff0c;轻松使用xxl-job调用kettle中的job和trans 》 今天我们一起来学习下使用xxl-job直接使用http调用…