1.引言
著名好莱坞法则:不要调用我们,我们会调用你。这是对依赖倒置原则(DIP,Dependency Inversion Principle)最形象的诠释,通过抽象机制有效解决类层次之间的关系,降低耦合的粒度,实现对抽象的依赖是依赖倒置的核心思想。
2.引经据典
核心思想:依赖于抽象
具体体现在:
- 高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
- 抽象不应该依赖于具体,具体应该依赖于抽象。
上面两点也就是解决方案,依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。依赖倒置原则的应用可以更好的维护和扩展。
3.应用反思
上节 设计模式原则]第一回:单一职责原则 中提到的例子,我们来应用依赖倒置原则。按照上面的解决方案,如下变动
先找到依赖关系:Switch(开关)依赖于Light(灯),解决:将Switch(开关)和Light 都依赖于一个抽象,如ILight,但是考虑到 开关和灯的动作类似,我们统一一个接口IDevices,即 Switch(开关)和Light都继承这个设备接口,这个接口它有两个方法,即开/关,在Switch中,我们用构造函数注入,代码 如下:
//设备 public interface IDevices { void TurnOn(); void TurnOff(); } //电灯 public class Light : IDevices { public void TurnOn() { Console.WriteLine("灯泡亮了"); } public void TurnOff() { Console.WriteLine("灯泡黑了"); } } //开关 public class Switch : IDevices { IDevices devices; public Switch(IDevices devices) { this.devices = devices; } public void TurnOn() { Console.WriteLine("打开开关"); devices.TurnOn(); } public void TurnOff() { Console.WriteLine("关上开关"); devices.TurnOff(); } }
//调用 static void Main(string[] args) { IDevices _switch = new Switch(new Light()); _switch.TurnOn(); _switch.TurnOff(); Console.Read(); }
客户端依赖于具体无法避免,上面的代码都已抽象,具体依赖抽象 如Switch和Light都依赖于IDevices,也可以 分开依赖ISwitch和 ILight。
4.规则建议
- 抽象的稳定性决定了系统的稳定性,因为抽象是保持不变的,依赖于抽象是面向对象程序设计的精髓,也是依赖倒置的核心思想。
- 依赖于抽象是一个通用的规则,而某些依赖于细节在所难免的,必须权衡抽象和具体的取舍,方法不是一成不变的。
- 依赖于抽象就是要对接口编程,不要对实现编程。
作者:Qlin
出处:http://www.cnblogs.com/qqlin/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。