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

  • 相关阅读:
    WeX5开发指南
    移动web app开发框架
    [转]10款 Web 开发常备工具
    为兴趣求职:如何学习UI框架,请将你的看法观点写在评论下面
    10 个顶尖的 Linux 开源人工智能工具
    【转】编写Chrome扩展程序
    HDOJ 4455 Substrings 递推+树状数组
    iOS开发人员:事实上你还有非常多东西须要学
    鸡肋的JdbcRDD
    OFbiz实体引擎
  • 原文地址:https://www.cnblogs.com/qqlin/p/2829444.html
Copyright © 2011-2022 走看看