zoukankan      html  css  js  c++  java
  • [设计模式原则]第二回:依赖倒置原则

    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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    javascript 事件冒泡的补充
    不存在的数组元素
    Android应用程序线程消息循环模型分析
    Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析
    Linux下的压缩解压缩命令详解
    Android应用程序组件Content Provider简要介绍和学习计划
    Android应用程序组件Content Provider应用实例
    三层架构之初识庐山真面目
    Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析
    Android应用程序消息处理机制(Looper、Handler)分析
  • 原文地址:https://www.cnblogs.com/qqlin/p/2829444.html
Copyright © 2011-2022 走看看