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.规则建议

  • 抽象的稳定性决定了系统的稳定性,因为抽象是保持不变的,依赖于抽象是面向对象程序设计的精髓,也是依赖倒置的核心思想。
  • 依赖于抽象是一个通用的规则,而某些依赖于细节在所难免的,必须权衡抽象和具体的取舍,方法不是一成不变的。
  • 依赖于抽象就是要对接口编程,不要对实现编程。

 

posted on 2012-12-25 17:16  Qlin  阅读(531)  评论(1编辑  收藏  举报