左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家
180940 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 119 讲
左耳听风
15
15
1.0x
00:00/00:00
登录|注册

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

使用函数数组实现Undo控制
在IntSet中嵌入Undo
声明Undo函数接口
实现Undo操作
Override Add和Delete方法
包装IntSet为UndoableIntSet
使用接口或泛型进行多态
在Button和ListBox中重写接口方法
Painter和Clicker接口
使用嵌入的方式进行层层分解
Widget嵌入到Label
反转依赖
实现Undo功能
嵌入结构多态
方法重写
结构体嵌入
示例:开关和电灯
业务逻辑依赖控制逻辑
把控制逻辑与业务逻辑分开
反转控制
嵌入和委托
控制反转
Go编程模式:委托和反转控制

该思维导图由 AI 生成,仅供参考

你好,我是陈皓,网名左耳朵耗子。
控制反转(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语言中使用Embed结构进行委托的示例,通过结构体嵌入和方法重写实现了多态。接着,陈皓提出了反转控制的概念,通过一个UndoableIntSet的示例展示了如何在已有代码的基础上扩展新功能。最后,他介绍了另一种方法,即反转依赖,通过定义一个函数接口实现了控制逻辑Undo对业务逻辑IntSet的依赖,从而实现了代码的复用。 本文通过具体的示例和代码演示,生动地阐述了委托和反转控制的编程模式,强调了分离控制逻辑和业务逻辑的重要性,以及如何通过不同的方式实现代码的扩展和复用。读者可以从中了解到Go语言中的编程模式和技术特点,对软件设计和开发有很好的启发和指导作用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • limix
    控制逻辑的特征是可复用性比较高,多场景可用,而业务逻辑的特征是专用性,控制逻辑,应该复用控制逻辑,而不是复用也许逻辑
    2022-09-07归属地:安徽
    5
  • debugtalk
    手动点赞
    2021-06-12
    4
  • cvvz
    反转控制: 第一种改写方法——继承,好处是原有代码可以复用,控制逻辑和业务逻辑解耦,坏处是通用的控制逻辑无法复用 第二种改写方法——反转控制,好处是复用通用的控制逻辑,坏处是要修改原有代码的逻辑,把控制逻辑嵌入到了业务逻辑中
    2022-08-27归属地:日本
  • Geek_ce6971
    实现undo功能,有个地方是写反了吗 在 Override 的 Add()中,记录 Delete 操作;在 Override 的 Delete() 中,记录 Add 操作;
    2022-01-19
    1
  • 方勇(gopher)
    日常中有些装饰器其实可以用这种方式替换
    2021-12-20
  • 衡子
    厉害了👍
    2021-11-30
  • 一光年
    控制逻辑依赖业务逻辑,不如让业务容器依赖控制逻辑
    2021-08-11
  • Geek_46da16
    会玩,
    2021-07-26
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部