04 | Go编程模式:委托和反转控制
陈皓
你好,我是陈皓,网名左耳朵耗子。
控制反转(Inversion of Control,loC )是一种软件设计的方法,它的主要思想是把控制逻辑与业务逻辑分开,不要在业务逻辑里写控制逻辑,因为这样会让控制逻辑依赖于业务逻辑,而是反过来,让业务逻辑依赖控制逻辑。
我之前在《IoC/DIP 其实是一种管理思想》这篇文章中,举过一个开关和电灯的例子。其实,这里的开关就是控制逻辑,电器是业务逻辑。我们不要在电器中实现开关,而是要把开关抽象成一种协议,让电器都依赖它。这样的编程方式可以有效降低程序复杂度,并提升代码重用度。
面向对象的设计模式我就不提了,我们来看看 Go 语言使用 Embed 结构的一个示例。
嵌入和委托
结构体嵌入
在 Go 语言中,我们可以很轻松地把一个结构体嵌到另一个结构体中,如下所示:
在这个示例中,我们把 Widget嵌入到了 Label 中,于是,我们可以这样使用:
如果在Label 结构体里出现了重名,就需要解决重名问题,例如,如果成员 X 重名,我们就要用 label.X表明是自己的X ,用 label.Wedget.X 表明是嵌入过来的。
有了这样的嵌入,我们就可以像 UI 组件一样,在结构的设计上进行层层分解了。比如,我可以新写出两个结构体 Button 和 ListBox:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Go编程模式:委托和反转控制 陈皓在本文中介绍了控制反转(Inversion of Control)的软件设计方法,强调将控制逻辑与业务逻辑分离,通过委托和嵌入的方式实现代码重用和降低程序复杂度。文章首先介绍了在Go语言中使用嵌入结构体的方法,通过委托和方法重写实现了多态。然后,陈皓提出了反转控制的概念,通过一个UndoableIntSet的示例展示了如何在已有代码上扩展新功能,但也指出了这种方式的问题。最后,他提出了另一种方法,即反转依赖,通过定义一个函数数组协议实现了控制逻辑的复用。这种方式使得业务逻辑依赖于控制逻辑,实现了更好的代码复用和扩展性。文章内容深入浅出,通过具体的示例和代码演示,清晰地阐述了委托和反转控制的概念及其在Go语言中的应用。
该试读文章来自《Go 语言编程模式实战》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(13)
- 最新
- 精选
- Erebus将业务注入到控制中、让控制只执行、让业务去依赖控制而不是控制依赖业务!这种IoC 和DI的思想太精妙了2021-01-18113
- 那风在极客控制是稳定的,业务是易变的,通过控制反转,让易变的依赖稳定的。2021-06-028
- 申申申申NewButton 这个方法在哪来的2021-04-1212
- Aibo控制注入到业务中,让业务复用控制逻辑;还可以注入不同的控制逻辑,便于拓展和测试2021-04-102
- Kingram# 总结 1、原代码是对IntSet包装成UndoableIntSet,添加了functions变量,实现了undo功能。 【代码耦合度较高,不符合代码的可复用性】 2、改造后是对functions包装成[]func()类型,这样一来undo功能可以封装到该类型中,再在IntSet中使用这个类型即可。 【undo功能可复用,实现解耦、依赖反转】2021-01-262
- 橙子888打卡。2021-01-112
- poppy1.set更好的实现是map[int]struct{} 2.最后在执行的undo的时候,会把undo本身的反向操作添加到functions中2022-05-271
- 葱味黑咖啡这等于是把controller层和service层的位置调换了吗?此时就是由service层向上层的API层提供调用服务,是这样理解吧?2021-01-2611
- Erebus用这种方式管理把context signal goroutine 管理,Add()和Do()真的很好用2021-01-1811
- 陈麒文打卡:这篇看了好几遍了2022-11-08归属地:福建
收起评论