Go 语言编程模式实战
陈皓
网名“左耳朵耗子”,资深技术专家
21556 人已学习
免费领取
Go 语言编程模式实战
15
15
1.0x
00:00/00:00
登录|注册

04 | Go编程模式:委托和反转控制

你好,我是陈皓,网名左耳朵耗子。
控制反转(Inversion of Control,loC )是一种软件设计的方法,它的主要思想是把控制逻辑与业务逻辑分开,不要在业务逻辑里写控制逻辑,因为这样会让控制逻辑依赖于业务逻辑,而是反过来,让业务逻辑依赖控制逻辑。
我之前在《IoC/DIP 其实是一种管理思想》这篇文章中,举过一个开关和电灯的例子。其实,这里的开关就是控制逻辑,电器是业务逻辑。我们不要在电器中实现开关,而是要把开关抽象成一种协议,让电器都依赖它。这样的编程方式可以有效降低程序复杂度,并提升代码重用度。
面向对象的设计模式我就不提了,我们来看看 Go 语言使用 Embed 结构的一个示例。

嵌入和委托

结构体嵌入

在 Go 语言中,我们可以很轻松地把一个结构体嵌到另一个结构体中,如下所示:
type Widget struct {
X, Y int
}
type Label struct {
Widget // Embedding (delegation)
Text string // Aggregation
}
在这个示例中,我们把 Widget嵌入到了 Label 中,于是,我们可以这样使用:
label := Label{Widget{10, 10}, "State:"}
label.X = 11
label.Y = 12
如果在Label 结构体里出现了重名,就需要解决重名问题,例如,如果成员 X 重名,我们就要用 label.X表明是自己的X ,用 label.Wedget.X 表明是嵌入过来的。
有了这样的嵌入,我们就可以像 UI 组件一样,在结构的设计上进行层层分解了。比如,我可以新写出两个结构体 ButtonListBox
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Go编程模式:委托和反转控制 陈皓在本文中介绍了控制反转(Inversion of Control)的软件设计方法,强调将控制逻辑与业务逻辑分离,通过委托和嵌入的方式实现代码重用和降低程序复杂度。文章首先介绍了在Go语言中使用嵌入结构体的方法,通过委托和方法重写实现了多态。然后,陈皓提出了反转控制的概念,通过一个UndoableIntSet的示例展示了如何在已有代码上扩展新功能,但也指出了这种方式的问题。最后,他提出了另一种方法,即反转依赖,通过定义一个函数数组协议实现了控制逻辑的复用。这种方式使得业务逻辑依赖于控制逻辑,实现了更好的代码复用和扩展性。文章内容深入浅出,通过具体的示例和代码演示,清晰地阐述了委托和反转控制的概念及其在Go语言中的应用。

该试读文章来自《Go 语言编程模式实战》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • Erebus
    将业务注入到控制中、让控制只执行、让业务去依赖控制而不是控制依赖业务!这种IoC 和DI的思想太精妙了
    2021-01-18
    1
    13
  • 那风在极客
    控制是稳定的,业务是易变的,通过控制反转,让易变的依赖稳定的。
    2021-06-02
    8
  • 申申申申
    NewButton 这个方法在哪来的
    2021-04-12
    1
    2
  • Aibo
    控制注入到业务中,让业务复用控制逻辑;还可以注入不同的控制逻辑,便于拓展和测试
    2021-04-10
    2
  • Kingram
    # 总结 1、原代码是对IntSet包装成UndoableIntSet,添加了functions变量,实现了undo功能。 【代码耦合度较高,不符合代码的可复用性】 2、改造后是对functions包装成[]func()类型,这样一来undo功能可以封装到该类型中,再在IntSet中使用这个类型即可。 【undo功能可复用,实现解耦、依赖反转】
    2021-01-26
    2
  • 橙子888
    打卡。
    2021-01-11
    2
  • poppy
    1.set更好的实现是map[int]struct{} 2.最后在执行的undo的时候,会把undo本身的反向操作添加到functions中
    2022-05-27
    1
  • 葱味黑咖啡
    这等于是把controller层和service层的位置调换了吗?此时就是由service层向上层的API层提供调用服务,是这样理解吧?
    2021-01-26
    1
    1
  • Erebus
    用这种方式管理把context signal goroutine 管理,Add()和Do()真的很好用
    2021-01-18
    1
    1
  • 陈麒文
    打卡:这篇看了好几遍了
    2022-11-08归属地:福建
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部