左耳听风_111_110_Go编程模式委托和反转控制
你好,我是陈浩网名做耳朵house.这节课呢我来和你聊一聊。
控制反转。
控制反转呢也就是LC,是一种软件设计的方法。
它的主要思想呢是把控制逻辑与业务逻辑分开,不要在业务逻辑里写控制逻辑。
因为这样呢会让控制逻辑依赖于业务逻辑。
我们要反过来让业务逻辑呢依赖控制逻辑。
我之前写过一篇文章,LCDIP其实是一种管理思想。
那其中呢我举了一个开关和电灯的例子。
那其实呢这里的开关啊就是控制逻辑,而电器呢是业务逻辑,我们不要在电器中实现开关,而是要把开关呢抽象成一种协议,让电器啊都依赖它。
那这样的编程方式呢可以有效的降低程序的复杂度,并提升代码的重用度。
对了,多提醒你一句,咱们这一系列的课程里啊有很多的代码建议。
你听完音频以后呢,一定要看一看代码,那这样的学习效果呢会更好。
那面向对象的设计模式呢我就不提了。
我们直接呢看一个go语言使用ebeed结构的示例。
在go语言中呢,我们可以很轻松的把一个结构体嵌到另一个结构体当中。
可以看一下文中这段代码。
在这个例子中呢,我们把vij的这个结构体啊嵌入到了label中,于是呢我们就可以生成一个label的实例。
而这个label呢也可以使用vii t的成员。
那如果在label的结构体里面出现了重名,那就需要解决重名的问题。
比如说啊如果成员x重名呢,我们就要用label点x表明是自己的x用label点wadge点x表明是嵌入过来的x那有了这样的嵌入呢,我们就可以像UI组件一样,在结构的设计上进行层层分解了。
比如说啊我可以新写出两个结构体button和list box,把label呢嵌到button里面,把visit呢嵌到list box里面。
那接下来呢我们需要两个接口,painter和click,用painter呢把组件画出来,用click啊表明点击事件。
当然label是用来展示文字的,所以对于label来说啊,只有painter没有。
而对于clickbutton和list box来说啊,painter和click都有。
那我们呢就可以像文章里代码这样把这些接口啊都实现出来。
那说到这儿啊,我要重点提醒你一下,因为label中嵌入了button,所以label点paint的实现呢也带入到了button点paint.那如果我不实现button点paint的话,会直接调用label点paint.所以呢如果在button中也声明了pain的方法就相当于overwrite.那接下来呢我再说一说嵌入结构的多肽从文中这段代码,我们就可以了解到整个多态是怎么执行的。
我们可以使用接口来多态,也可以使用泛型的interface来多态啊,但是这样呢需要有一个类型转换。
我们再来看一个反转控制的例子。
我们有一个存放整数的数据结构,inset,它呢实现了add delete和contains三个操作。
那其中呢前两个是写操作,后一个呢是读操作。
那现在呢我们想实现一个暗do的功能,我们呢就可以再包装一下inthe set变成undoable inthe set.那具体的代码我放到了文章里,我来解释一下这段代码。
首先呢我们在按double inset里面啊嵌入了inset,然后呢overwrite重写了它的adt和delete的方法,而contains方法呢没有overwrite,所以呢就被带到了adorable inset中来了。
那在我重写的艾d方法中呢,记录delete操作。
在我重写的delete方法中呢,记录add操作。
最后呢我新加入了一个暗do方法在其中啊,我进行暗do操作。
用这样的方式啊给已有的代码扩展新的功能是一个很好的选择。
那这样呢就可以在重用原有代码的功能和新的功能中啊达到一个平衡。
但是呢这种方式啊有一个最大的问题就是按度操作呢其实是一种控制逻辑,并不是业务逻辑。
所以在复用完度这个功能的时候呢,是有问题的。
因为其中呢加入了大量跟interset相关的业务逻辑。
那现在呢我们再来看另外一种方法,也就是反转依赖。
怎么解决这个问题?我们先声明一种函数接口表示我们的难度控制呢可以接受的函数签名是什么样的那有了这个协议之后啊,我们难度控制逻辑啊就可以像文章中这么写。
那看到这段代码呢,不用觉得奇怪,因为俺度呢本来就是一个类型,它不一定非得是一个结构体,是一个函数数组啊,也没有什么问题。
然后呢,我们在inset里面嵌入暗度。
那接着呢在add和delete里面使用刚刚声明的方法就可以完成功能了。
那这个呢就是控制反转,它不是由控制逻辑暗do来依赖业务逻辑inset,而是用业务逻辑interset去依赖undo.那这里依赖的其实是一个协议。
这个协议呢是一个没有参数的函数数组,我们可以看到,这样一来呢,我们按度的代码就可以复用了。
好了,这节课呢就到这里。
如果你觉得今天的内容对你有所帮助啊,欢迎你帮我分享给更多人。