控制反转思想,来自生活与编程等各方面的例子

勇哥注:

控制反转思想,无论是编程还是生活中,都会有大量的应用。

发散思考一下其乐无穷。。。。


先提一下几个专业名词:

依赖倒置原则(DIP):一种软件架构设计的原则,是一种抽象概念。 

     (DIP缩写是指  Dependency inversion principle

控制反转(IoC):一种设计模式,是DIP的具体实现方式。(IoC缩写是指  inversion of control)

依赖注入(DI): IoC的一种实现方式,用来反转依赖  (DI缩写是指  Dependency Injection)

IoC容器: 依赖注入的框架(DI的框架),用来映射依赖,管理对象创建和生存周期


控制反转的作用:

控制反转(Inversion of Control,缩写为IoC)是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

控制反转的主要作用是将对象的创建和管理从程序内部剥离开来,放到程序外部,当程序运行需要时由“外部”提供。

这个“外部”通常是实现了某种工厂模式的框架。

这种控制权的“反转”实现了程序的解耦合,降低了各个模块间的紧密度,

从而避免了在修改模块时需要同时修改多个相关联的模块,降低了程序的修改和管理成本。

此外,控制反转还有助于提高代码的可读性和可维护性,因为依赖关系变得更加清晰和明确。

同时,它也有助于实现代码的重用和扩展,因为各个模块之间的依赖关系被降低到了最低限度。


控制反转的核心关键词: 对象的核心需求、 控制转移、 分离关注点、降低耦合


(一)生活中的例子


 代理人战争

代理人战争可以视为控制反转的一个例子。
在代理人战争中,一个或多个外部实体(如国家、组织等)通过提供支持、
武器、资金等手段,促使第三方实体(代理人)在目标国家或地区进行战争或冲突,
以达到自身战略目标。
这种战争形式实际上将战争的控制权从直接参与者转移到了外部实体手中,
实现了控制权的反转。
因此,从控制权的转移角度来看,
代理人战争可以被认为是控制反转思想在政治和军事领域的一个应用例子。


 城市公交系统

在公共交通系统中,乘客不需要关心公交车的具体行驶路线和班次,
只需要在车站等待即可。
公交公司就像是控制反转容器,它负责管理公交车的运行和调度,
而乘客只需要依赖公交公司提供的服务即可。


 智能家居系统

在智能家居系统中,我们可以通过中央控制器来控制家里的各种设备,
如灯光、空调、门锁等。
中央控制器就像是控制反转容器,它负责管理各个设备,
而设备本身只需要提供功能即可。
我们可以通过中央控制器来实现设备之间的协同工作,
而不需要每个设备都了解其他设备的具体实现。


 汽车自动驾驶系统

自动驾驶汽车是另一个体现控制反转思想的例子。在传统的汽车中,
驾驶员需要完全控制汽车的行驶方向、速度和刹车等。
但在自动驾驶汽车中,大部分或全部的控制权被交给了车载的计算机系统。
计算机系统通过感知周围环境,自动规划行驶路径和控制汽车的动作,
驾驶员只需要设定目的地,就可以将行驶过程完全交给自动驾驶系统。


 餐饮连锁/便利店连锁

在餐饮/便利店服务行业,控制反转体现在中央厨房和分店之间的关系上。
中央厨房负责食材的采购、加工和配送,
而分店只需要负责烹饪和销售。
中央厨房就像是控制反转容器,它负责管理食材的供应链,
而分店则依赖于中央厨房提供的食材进行烹饪。


 智能电锯煲/类似的小家电

像智能冰箱、智能洗衣机等,用户只需要通过手机或语音指令下达命令,
具体的运行过程则由家电自动完成。
机器人吸尘器:用户只需设定清扫的区域和时间,
机器人会自主规划路线,完成清扫工作。


  支付宝

支付宝对于淘宝交易中买卖双方来说,可以视为一种控制反转的容器。
在淘宝交易中,支付宝作为一个第三方支付平台,
充当了买卖双方之间的中介角色。
买卖双方将资金和商品的控制权交给支付宝,
由支付宝来管理和监管交易过程,确保交易的安全和可靠。
这种机制下,支付宝承担了控制反转容器的角色,
它负责管理交易流程、资金流转等核心操作,
而买卖双方只需要按照支付宝规定的流程进行操作即可完成交易。
因此,支付宝在淘宝交易中的应用可以被认为是一种控制反转的体现,
它通过管理交易过程中的控制权,简化了买卖双方的交易流程,
提高了交易的安全性和效率。


  软件公司总监的项目管理

技术部门总监将项目管理的任务和责任“反转”到了几个核心主管上面,
而不是直接管理基层员工来控制项目。
这种管理方式确实与控制反转(IoC)的概念相符,
因为它涉及到了责任的转移或委托,
使得高层管理人员能够更专注于战略和决策,
而底层的实现和细节则由下属主管来处理。
通过这种方式,总监可以降低自己与基层员工和项目细节之间的耦合度,
从而更好地关注整体战略和公司目标。
同时,主管们也能更好地发挥其专业能力和管理技能,
对项目进行更精细化的管理和控制。


   人际交往中怎么说动一个人

在人际交往中,控制反转思想可以理解为调整交往的方式,
从直接控制对方的行为和反应,转变为通过影响和引导对方的思想和情感,
从而达到更好的交往效果。
例如,通过倾听、理解和尊重对方的观点和需求,
建立起良好的沟通和信任关系,
从而更有效地影响和引导对方的行为和决策。
这种交往方式与控制反转思想在编程中的应用类似,
都是从直接控制转变为间接影响,
通过创建一个更和谐、互相理解和尊重的环境,达到更好的效果。


   ATM机取钱

ATM机接受任何支持银联的银行卡,不管是什么银行的卡,都可以插进去取到钱。
这是把用户的需求“取款”,反转给了ATM机,而ATM的工作细节对用户来讲看不见,
用户即不关心自己银行卡是哪个行的,也不关心卡的大小是不是能插进ATM机。
ATM机扮演了一个“控制器”的角色,它接受任何支持银联的银行卡,
并处理取款请求。用户不需要知道ATM机是如何工作的,
只需要插入银行卡并输入取款金额即可。
这种设计方式将控制权从用户手中转移到了ATM机中,从而实现了控制反转。


   电脑主板与pci设备的关系

电脑主板作为高层模块,只依赖于抽象的PCI槽接口,而不关心具体的PCI设备。
而PCI设备作为底层模块,只要符合PCI总线协议,就可以插入到PCI槽中使用。
这种设计方式实现了依赖倒置原则(Dependency Inversion Principle, DIP),
即高层模块依赖于抽象,而不依赖于具体实现。同时,它也体现了控制反转的思想。
在传统的设计中,高层模块通常会直接依赖于底层模块的具体实现,
但这种方式增加了耦合性,降低了系统的可维护性和可扩展性。
而在主板与pci设备这个比喻中,通过引入PCI槽作为接口,
实现了高层模块与底层模块的解耦。
这种将控制权交给接口,并由底层模块实现接口的方式,正是控制反转的体现。


   劳务派遣公司

劳务派遣公司负责为工厂招聘员工,承担了这些招聘员工的工资发放、社会保险、
人员管理等任务,而工厂只是单纯用工,
这些员工产生的纠纷和法律责任都由劳务派遣公司承担。
工厂的用工需求反转给了劳务派遣公司。

在这个例子中,工厂将其招聘、工资发放、社会保险、人员管理等任务,
即员工的管理权和控制权,转移给了劳务派遣公司。这种转变符合控制反转的定义,
即控制权从一部分(这里是工厂)转移到另一部分(劳务派遣公司)。
因此,我们可以认为这种情况是控制反转的应用。



(二)编程领域的应用


  插件系统

插件系统也体现了控制反转的思想。在插件系统中,
主应用程序通常定义一组接口,
然后插件开发者实现这些接口来提供额外功能。
主程序在运行时动态加载插件,并调用插件提供的功能。
这种机制将控制权从主程序转移到插件,实现了功能的可扩展性和解耦。


  事件驱动编程

在事件驱动编程中,控制反转体现在事件处理上。
通常有一个事件发布者(或事件源),
它不知道具体的事件处理者(或监听器)。当事件发生时,
事件发布者只负责发布事件,而不关心谁来处理这个事件。
事件处理者通过订阅事件来获得处理机会。
这样,事件发布者和处理者之间的依赖关系就被倒置了。


 winfom UI框架/vc++的mfc框架

使用winform UI框架开发界面,
用户只需要关注控制事件和自己编制的处理函数,
而界面的显示与刷新等工作由框架维护。
这意味着界面的显示和刷新等工作的控制权由用户端转移到了winform框架中去,
实现了控制权的反转。因此,这个例子符合控制反转的思想。

         

 傻瓜界面设计

一款视觉检测软件中,用户通过几个简单的滑块调节检测效果,
这几个滑块实际是将内部数百个参数的调节过程屏蔽起来,
实际上是将控制权从用户手中转移到了软件内部。
用户只需要操作滑块,而不需要关心内部参数的具体调节过程,
这就是一种控制反转的体现。
因此,这种傻瓜UI设计符合控制反转的思想。


  wpf

在WPF中使用XAML标签描述界面,实际上是将界面的设计和逻辑分开。
美术人员可以专注于设计,而开发人员则可以专注于实现功能和逻辑。
美术人员可以通过修改XAML来调整界面,而不需要改动代码逻辑。
这种方式确实可以降低界面设计和代码逻辑之间的耦合度,
从而更易于维护和更新。
所以说,虽然WPF中使用XAML标签的方式并不等同于传统意义上的控制反转,
但它们的核心理念是一致的,那就是“分离关注点”或“降低耦合度”,
使得各个部分更易于独立变化和更新,
从而提高了整体系统的可维护性和可扩展性。


  设计模式:依赖倒置

依赖倒置原则,它转换了依赖,高层模块不依赖于低层模块的实现,
而低层模块依赖于高层模块定义的接口。
通俗的讲,就是高层模块定义接口,低层模块负责实现。

Bob Martins对DIP的定义:
高层模块不应依赖于低层模块,两者应该依赖于抽象。
抽象不不应该依赖于实现,实现应该依赖于抽象。

 

 

--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2023-11-07 14:23:19 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864