Java设计模式之依赖反转(倒置)原则(Dependency inversion principle,DIP)
2018-02-06 00:00
405 查看
摘要: 依赖反转原则由罗伯特·C·马丁提出,并且在数篇公开著作中被表述,包括论文《面向对象设计质量标准:对于依赖的分析》,以及一篇1996年出现在C++报道中的名为《依赖反转原则》的文章,和《敏捷软件开发,原则,模式和实践》,《C#中的敏捷原则,模式和实践》两本书。
我们都知道Java语言是OOP,在Java开发过程过,抽象一般指的就是借口和类。依赖反转原则又叫做依赖倒置原则。
在面向对象编程中,依赖反转原则是个什么情况呢?
定义如下:
A. High-level modules should not depend on low-level modules. Both should depend on abstractions.
B. Abstractions should not depend on details. Details should depend on abstractions.
即:
A、高层次的模块不要依赖于低层次的模块,都应该依赖于抽象(接口)。
B、抽象(接口)不应该依赖于具体,而具体要依赖于抽象。
我们来具体理解一下哈,比如说,码农小明(为什么躺枪的是小明(╥╯^╰╥))穿一件毛衣,可能是圆领的也可能是鸡心领的,可能是蓝色的,也可能是红色的。
然后我们再看看client代码是怎么写的:
我们假设项目组Coder有小明、大龙、老张等6个,他们有的喜欢看韩剧,有的喜欢看动漫,有的喜欢林志玲,有的喜欢听摇滚。但是他们可能在天冷的时候都会穿毛衣,有穿美特斯邦威的,有穿以纯的。那么我们在写代码的时候,知道接口都有穿毛衣这个方法,针对不同的毛衣,我们创建不同的实例,只要号码没问题,都可以穿上。扩展起来是不是很方便呀φ(゜▽゜*)♪
我们看到,是针对更加抽象的interface来编程,具体的类依赖于抽象的接口。即对于具体的类来说,不要互相依赖,而要针对接口编程。
这张图我们也可以比较直观的看到依赖反转原则的应用。
依赖反转原则基于这样的情况:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。
使用DIP的优点:
减少类之间的耦合
提高系统的稳定性
提高系统的可维护性和可扩展性
当然,使用这个原则会导致有更多的类和接口来维护,但是更加灵活。 依赖反转原则不应该盲目使用在模块中。比如一些功能类之类的,则不需要使用这个原则。
最佳实践:
每个类尽量有借口或者抽象类
变量的类型尽量声明为借口或者抽象类
尽量不要复写父类的方法
结合里氏替换原则来使用
参考:
https://en.wikipedia.org/wiki/Dependency_inversion_principle
http://blog.csdn.net/moxiaoya1314/article/details/51899048
https://springframework.guru/principles-of-object-oriented-design/dependency-inversion-principle
《设计模式之禅》
《The Dependency Inversion Principle》
我们都知道Java语言是OOP,在Java开发过程过,抽象一般指的就是借口和类。依赖反转原则又叫做依赖倒置原则。
在面向对象编程中,依赖反转原则是个什么情况呢?
定义如下:
A. High-level modules should not depend on low-level modules. Both should depend on abstractions.
B. Abstractions should not depend on details. Details should depend on abstractions.
即:
A、高层次的模块不要依赖于低层次的模块,都应该依赖于抽象(接口)。
B、抽象(接口)不应该依赖于具体,而具体要依赖于抽象。
我们来具体理解一下哈,比如说,码农小明(为什么躺枪的是小明(╥╯^╰╥))穿一件毛衣,可能是圆领的也可能是鸡心领的,可能是蓝色的,也可能是红色的。
interface Coder { void wearSweater(Sweater sweater); } class XiaoMing implements Coder{ @Override public void wearSweater(Sweater sweater) { } } interface Sweater { } class TneckSweater implements Sweater { }
然后我们再看看client代码是怎么写的:
Coder xiaoming = new XiaoMing(); Sweater tneckSweater = new TneckSweater(); xiaoming.wearSweater(tneckSweater);
我们假设项目组Coder有小明、大龙、老张等6个,他们有的喜欢看韩剧,有的喜欢看动漫,有的喜欢林志玲,有的喜欢听摇滚。但是他们可能在天冷的时候都会穿毛衣,有穿美特斯邦威的,有穿以纯的。那么我们在写代码的时候,知道接口都有穿毛衣这个方法,针对不同的毛衣,我们创建不同的实例,只要号码没问题,都可以穿上。扩展起来是不是很方便呀φ(゜▽゜*)♪
我们看到,是针对更加抽象的interface来编程,具体的类依赖于抽象的接口。即对于具体的类来说,不要互相依赖,而要针对接口编程。
这张图我们也可以比较直观的看到依赖反转原则的应用。
依赖反转原则基于这样的情况:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。
使用DIP的优点:
减少类之间的耦合
提高系统的稳定性
提高系统的可维护性和可扩展性
当然,使用这个原则会导致有更多的类和接口来维护,但是更加灵活。 依赖反转原则不应该盲目使用在模块中。比如一些功能类之类的,则不需要使用这个原则。
最佳实践:
每个类尽量有借口或者抽象类
变量的类型尽量声明为借口或者抽象类
尽量不要复写父类的方法
结合里氏替换原则来使用
参考:
https://en.wikipedia.org/wiki/Dependency_inversion_principle
http://blog.csdn.net/moxiaoya1314/article/details/51899048
https://springframework.guru/principles-of-object-oriented-design/dependency-inversion-principle
《设计模式之禅》
《The Dependency Inversion Principle》
相关文章推荐
- OO设计原则 -- Dependency Inversion Principle:OO设计的 DIP依赖倒置原则(转)
- 依赖倒置原则(DIP)Dependence Inversion Principle --- 设计模式原则
- IOS设计模式的六大设计原则之依赖倒置原则(DIP,Dependence Inversion Principle)
- IOS设计模式的六大设计原则之依赖倒置原则(DIP,Dependence Inversion Principle)
- OO设计原则 -- Dependency Inversion Principle:OO设计的 DIP依赖倒置原则
- IOS设计模式的六大设计原则之依赖倒置原则(DIP,Dependence Inversion Principle)
- Java设计模式——六大原则之依赖倒置
- IOC-控制反转(Inversion of Control),也成依赖倒置(Dependency Inversion Principle)
- IOS设计模式的六大设计原则之依赖倒置原则(DIP,Dependence Inversion Principle)
- 设计模式六大原则(3):依赖倒置原则DIP(Dependence Inversion Principle)
- Java IoC模式(依赖、依赖倒置DIP、依赖注入DI、控制反转)
- OO设计原则 -- Dependency Inversion Principle:OO设计的 DIP依赖倒置原则
- 设计模式六大原则——依赖倒置原则(DIP,Dependence Inversion Principle)
- JAVA设计模式-依赖倒转原则
- 依赖注入 控制反转 服务定位器 模式 Dependency Injection Inversion of Control Service Locator Patterns | 超级经典
- 重构着讲解设计原则与模式——从DIP中“倒置”的含义说接口的正确使用
- 面向对象设计原则之依赖倒置原则(Dependency Inversion Principle)
- 设计模式6大原则之依赖倒置原则
- java 设计模式 - 依赖倒置
- 从Java的角度理解设计模式85: 继续演化:对违反DIP原则的修复和应用创建型模式的展望