当前位置: 首页 > news >正文

设计模式-控制反转【golang】

设计模式-控制反转【golang】

听不懂的概念

将程序中对象的创建、依赖管理的控制权,从代码内部转移到外部容器/框架

获取mysql数据,存入redis

packagemrimport("fmt""log""os""testing")typeDatabaseinterface{Query(sqlstring)string}typeCacheinterface{Set(key,valuestring)}// Mysql操作typeMySQLDatabasestruct{}func(db*MySQLDatabase)Query(sqlstring)string{returnfmt.Sprintf("MySQL result: %s",sql)}// Pg操作typePgDatabasestruct{}func(db*PgDatabase)Query(sqlstring)string{returnfmt.Sprintf("PgSQL result: %s",sql)}// Redis操作typeRedisCachestruct{}func(c*RedisCache)Set(key,valuestring){fmt.Printf("Redis set: %s = %s\n",key,value)}// 业务逻辑funcTestManual(t*testing.T){db:=&MySQLDatabase{}cache:=&RedisCache{}// 下面为业务逻辑代码user:=db.Query("SELECT * FROM users WHERE id=1")cache.Set("user:1",user)// ………………}

定义好了查询 mysql、设置 redis 的方法,TestManual需要做的事情是,查询 mysql 的值存入 redis

这时,TestManual方法需要依赖两个依赖DatabaseCache

当我的业务逻辑代码不变,需要更换一下两个依赖时,例如我要把mysql切换成PostgreSql时,那只能修改我的业务逻辑方法了,例如

// 业务逻辑funcTestManual(t*testing.T){// db := &MySQLDatabase{}db:=&PgSQLDatabase{}cache:=&RedisCache{}// 下面为业务逻辑代码user:=db.Query("SELECT * FROM users WHERE id=1")cache.Set("user:1",user)// ………………}

所以,我需要把依赖的这部分代码提出来,以后换库还是什么的,不去动我的业务逻辑方法->TestManual

换一种写法,添加一个RunUserService,叫做管理容器也好方法也好,总之是一块儿代码封装

packagemrimport("fmt""log""os""testing")typeDatabaseinterface{Query(sqlstring)string}typeCacheinterface{Set(key,valuestring)}// Mysql操作typeMySQLDatabasestruct{}func(db*MySQLDatabase)Query(sqlstring)string{returnfmt.Sprintf("MySQL result: %s",sql)}// Pg操作typePgSqlDatabasestruct{}func(db*PgSqlDatabase)Query(sqlstring)string{returnfmt.Sprintf("PgSQL result: %s",sql)}// Redis操作typeRedisCachestruct{}func(c*RedisCache)Set(key,valuestring){fmt.Printf("Redis set: %s = %s\n",key,value)}// 数据服务操作函数typeDataServiceHandlerfunc(db Database,cache Cache)funcRunUserService(handler DataServiceHandler){// 依赖代码迁移到这里db:=&MySQLDatabase{}// db := &PgSqlDatabase{}cache:=&RedisCache{}handler(db,cache)}// 业务逻辑funcTestManual(t*testing.T){RunUserService(func(db Database,cache Cache){// 下面为业务逻辑代码user:=db.Query("SELECT * FROM users WHERE id=1")cache.Set("user:1",user)})}

这种体现形式为 闭包回调函数+interface 的组合方式

我认为其本质还是回调函数,通过传递一段预定义代码块,在真正执行业务代码时调用栈返回去执行,结果再回到调用方这里

从而简化调用方的代码量

更多的关于依赖注入、控制反转的实现参考 https://blog.csdn.net/qq_37485347/article/details/142203484

http://www.cnnetsun.cn/news/26182.html

相关文章:

  • 西安电子科技大学专属信纸模板:3分钟打造专业学术形象
  • 【每日一题】PCIe答疑 - 接大量 GPU 时主板不认设备或无法启动和MMIO的可能关系?
  • 富有的哈佛人 —— 储蓄:财富积累的第一块基石
  • 终极指南:快速掌握eventpp事件处理库的8种集成方法
  • 光刻胶用二正丁基胺增感剂:
  • Spyder vs Jupyter:科学计算效率大比拼
  • 【第八天】08c#今日小结
  • Windows临时文件夹清理指南:释放C盘空间
  • AI助力:用自然语言生成复杂tar命令,告别记忆负担
  • 三相L型并网逆变器:dq坐标系下的控制系统设计与Simulink仿真模型搭建
  • RBP神经网络PID自适应控制模型(Matlab仿真模型及详解资料包,省去PID参数调节
  • 华为OD机试双机位C卷 - 挑选宝石 (C++ Python JAVA JS GO)
  • 用ROS2快速验证机器人创意:48小时开发挑战
  • 光伏电池电网能量管理控制策略模型仿真与优化在Simulink平台下的研究
  • 在flac3d7.0中实现flac3d和3dec的耦合计算
  • 3分钟用requestIdleCallback打造性能分析工具
  • 如何用Skyvern在5分钟内构建智能Web自动化工作流
  • 必看!2025年OK镜保养注意事项高品质推荐榜单,助你提升视力体验
  • LLC谐振变换器:变频与移相混合控制的仿真模型
  • 科研人员必备:Sci-Hub论文下载与管理的自动化方案
  • 基于Android的安卓云笔记系统(源代码+文档+PPT+调试+讲解)
  • HAMA.bundle:打造专属动漫图书馆的终极解决方案
  • 5分钟搭建texlive安装教程原型
  • 2025刷屏事件背后:一场正在席卷每个人的“能力革命”
  • 源代码加密方案深度解析与选型指南
  • 企业微信Linux客户端开发效率提升300%的秘诀
  • 传统VS现代:WiFi密码字典生成效率对比
  • KMP OpenHarmony 农产品价格预测分析器
  • 2025降重工具大横评:快降重网实测,如何从40%降到5%?
  • 基于CNN的图像识别垃圾分类系统开题报告