Dependence Inversion Principle
来源:互联网 发布:芒果tv有Mac 版吗 编辑:程序博客网 时间:2024/06/07 02:45
Dependence Inversion Principle(依赖倒置原则),简称DIP,OO设计原则之一。它的原定义是这样的::High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions.翻译 成中文就是:
1.高级模块不能依赖于低级模块,二者都应该依赖于抽象
2.抽象不应该依赖于细节
3.细节依赖于抽象
低级模块指的是具有原子(简单)逻辑的模块,不能再分,而高级模块就是非原子(复杂)逻辑的模块,是多个原子逻辑模块的组合。
依赖指的是一个模块内部引用了一个外部模块,如:模块M1内部引用了模块M2,则M1依赖于M2。依赖又可以说成是耦合,是一种常见的表达,耦合分为三种:
零耦合:两个类之间没有相互依赖的关系
具体耦合:耦合关系发生在两个具体类之间
抽象耦合:偶然关系发生在类和抽象类之间(是DIP提倡的)
Robert C. Martin 对 “Bad Design”的定义如下:
1.it is hard to change because every change affects too many other parts of system.
2.when you make a change,unexpected other parts of the system break.
3.it's hard to reuse in another application,because it cannot be disentangled(分离) from the current application.
导致Bad design 原因主要就是因为高级模块过度的依赖于低级的模块,从而使得模块间过于藕和,当对低级的模块进行修改时,就会影响我们的高级的模块。由于高级模块过度的依赖于低级的模块,导致我们的高级模块不利于重用,因为another application 不会配置我们的低级模块。相反一个良好的设计,应该保证各个模块之间是相互独立的,是可以被替换的。打个比方,汽车引擎公司生产的引擎不会只适用于某个品牌的汽车,而是所有的汽车都可以用。原因就是因为引擎对汽车来说是独立的,是可以被替换的,引擎就是一个低级的模型,汽车就是一个高级的模型。
DIP通俗点就是说,要针对抽象编程,而不是具体的实现编程。例如:我们设计一个通用的数据库模块DatabaseModel,其中包含了数据的写入模块WriteModel 和数据的读取模块ReadModel,DatabaseModel就是一个高级模块,WriteModel和ReadModel就是一个低级模块。如果现在我们使用的是mysql数据库,我们的ReadModel,和WriteModel都是针对mysql数据库设计的,DatabaseModel直接使用了针对具体实现(mysql数据库)的低级模块。现在我们换了一个平台,我们的数据库换成了oracle,那么我们的高级模块(DatabaseModel)在新平台上就不能使用了。DIP就为我们提出了一个解决此类问题的方法:在高级模块和低级模块之间添加一个抽象层(这让我想起了一句话,在计算机领域,只要抽象出新的一层就可以解决所有的问题,确实如此),高级模块,低级模块都针对抽象设计。低级模块可以由抽象生成针对mysql,oracle,mssql的WriteModel和ReadModel, 而 DatabaseModel 针对抽象设计,可以适应由不同的低级模块组成的平台。
- Dependence Inversion Principle
- Dependence Inversion Principle(DIP)
- 依赖倒置原则(Dependence Inversion Principle)
- 温习设计模式1--dependence inversion principle
- 依赖倒置原则(Dependence Inversion Principle)
- 依赖倒置原则(Dependence Inversion Principle)
- 依赖倒换原则(Dependence Inversion Principle,DIP)
- 依赖倒置原则(Dependence Inversion Principle)
- 依赖倒置原则(Dependence Inversion Principle)
- 依赖倒置原则(Dependence Inversion Principle)
- 依赖倒置原则(Dependence Inversion Principle)
- 依赖倒置原则(Dependence Inversion Principle)
- 【六大设计原则】3. 依赖倒置原则 -Dependence Inversion Principle:
- 设计原则-依赖倒置原则(Dependence Inversion Principle)
- 软件设计原则(四)依赖倒置原则 -Dependence Inversion Principle
- 【设计模式】依赖倒置原则(Dependence Inversion Principle)
- 依赖倒置原则(DIP)Dependence Inversion Principle --- 设计模式原则
- 设计模式原则篇(3):依赖倒转原则---Dependence Inversion Principle
- 小马马说MapReduce算法案例(1):二度人脉好友推荐
- visual studio 2015对C/C++标准的支持情况
- 百度地图JavaScript API开发叠加行政区划图
- Linux常见命令汇总
- 错误代码: 1066 Not unique table/alias: 'c'
- Dependence Inversion Principle
- Flocker浅析与Docker插件(3)
- socket基本函数
- Spring的AOP小例子,以及遇到的相关ADVICE代码不起作用为题
- 【mybatis】mybatis数据源源码剖析(JNDI、POOLED、UNPOOLED)
- 大菲薄那次数
- TNS-12535错误处理
- poj 3109 离散化+扫描线+树状数组
- 回文数zigzag