Answers:
注意:这已从我之前的示例中完全重写
考虑一下电源插座。在任何给定的国家/地区,高级别政策都是电源插座始终相同。无论从哪里获得电力(煤炭,天然气,核能),墙壁上的插座都应始终通过同一组连接器输出相同数量的电力。
现在,您可以将任何设备插入该插槽,因为它们都有一个公共接口,即“插头”。高级策略永远不必规定实施细节的任何部分。只需插上电源即可。
现在,如果您有不需要交流电源的设备(也许它在7V直流电路上运行),您仍然可以使用该高级策略,则只需在电源和设备之间使用某种适配器即可。而且,由于每个人都有相同的高级策略,因此制造商可以将其内置到实施中,而无需更改高级策略。将实施与策略(您插入笔记本电脑)连接的人也不需要真正理解。
此外,如果制造商想在另一个国家/地区销售相同的设备,则他们要做的就是开发不同的适配器。因此,同一实现可以使用多个策略,而同一个策略可以运行多个实现。
这是依赖倒置的完美示例。
但这是有趣的一点:回到我最初所说的。“从哪里获得电力都没关系。” 这也是一个实现细节。高级别策略仍然是所有电源插座都具有相同的形状并发出相同类型的电源。低层的实施细节既是电力的来源,又是电力的运行方式。
用编程的术语来说,这意味着高级策略是API提供并且应用程序使用的接口(语言在其中支持语言。DI的另一种形式是鸭嘴式。),而低级实现细节都是使用它的应用程序和API本身,两者都不需要相互理解。
适配器可用于将同一实现适合不同的策略。
软件重用的经典方法是构建不依赖其他组件的组件(这就是使它们成为低级别的组件),然后构建依赖于较低级别组件的较高级别组件。“高级别”和“低级别”具体取决于依赖关系的方向,这不是组件功能所固有的,而通常只是体系结构决策。
因此,当构建单个业务应用程序不依赖于工作流自动化,但是您的工作流控制器直接依赖于该业务应用程序时,则应该清楚的是,工作流自动化是“高级策略”,而业务应用程序则是“高级策略”。 “低级”组件。请注意,这种结构不是强制性的-如果您的工作流自动化组件是通用框架,也没有与特定的业务应用程序耦合,但是可以配置为服务于不同的应用程序,那么您已经开始应用DIP。在这种情况下,在这两件事之间“高级别” /“低级别”的分离可能不再有意义。
因此,名称“依赖倒置”在某种程度上具有误导性-因为依赖不是“倒置”而是完全删除了(或更确切地说,是从编译时的依赖变为运行时的依赖)。
我用一个简单的图像来说明DIP。软件开发的经典观点是作为一个构建过程,每一层都位于支持它的较低层之上。使用依赖倒置原理更像是构建移动设备。
移动层中的高层通过连接它们的字符串而不是高层坐在较低层上。在某种程度上,较低的层依赖于该接口来提供支持(没有它们掉落的字符串)。简而言之就是DIP。