六大设计原则详解(3)-依赖倒置原则

作者: 秦子帅 | 来源:发表于2017-09-16 06:59 被阅读88次

简介:

依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
依赖倒置原则包含了两层含义:
A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
B.抽象不应该依赖于具体(细节),具体(细节)应该依赖于抽象。


.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象

低层模块也就是不可拆分的原子逻辑,高层模块是N个原子逻辑的组合。
抽象在JAVA中指的是接口和抽象类,细节指的是实现类、实现接口、继承抽象类的实现。

下面通过实例来了解一下: 场景是体育课开始了,可以踢球!
下面分别是Football类和Sport类

public class Football {
      public String playfootball(){  
            return "我可以踢足球啦……";  
        }  
}
public class Sport {
    
      public static void main(String[] args) {
            Sport a=new Sport();
            a.Play(new Football());
    }
    
     public void Play(Football football){  
            System.out.println("体育课开始啦");  
            System.out.println(football.playfootball());  
        }    
}

运行结果为:


现在我们把需求改一下,改成"我想打篮球",这时候我们会发现Sport类中没有篮球,体育课上竟然没有篮球。如果要加上的话我们得修改Sport类,这样的修改是不符合依赖倒置原则的,因为Sport类是高层模块,Football是低层模块,根据依赖倒置原则,高层次的模块不应该依赖于低层次的模块。但是上面的代码显然是底层模块变化,高层模块也跟着修改了。

正确"体育课"与"篮球"的逻辑如下:
首先要定义一个interface

public interface SportType {
     public String play();  

}

然后低层模块实现这个interface

public class Basketball  implements SportType{
         
    @Override
    public String play() {
        // TODO Auto-generated method stub
        return "我可以打篮球啦……";
    }   
}

高层模块:

public class Sport  {
    
      public static void main(String[] args) {
            Sport a=new Sport();
        //  a.Play(new Football());
            a.Play(new Basketball());
    }
    
     public void Play(SportType sportType){  
            System.out.println("体育课开始啦");  
            System.out.println(sportType.play());  
        }        
}

运行结果为:


从上面代码我们可以看出,无论"体育课"想打什么球类,我们都可以在不动高层模块的前提下,任意的修改。
注意,根据依赖注入原则,他们都应该依赖于抽象,而上面的例子高层模块没有依赖抽象,上面的例子主要解释了高层次的模块不应该依赖于低层次的模块,最正确的结果是高层模块也写一个interface来实现。这里我就不贴出来了。大家应该明白这个意思。


抽象不应该依赖于具体(细节),具体(细节)应该依赖于抽象

抽象不应该依赖于具体(细节) ,也就是说高层模块的接口不依赖于Football类、Basketball类,上面的例子也充分的证实了这一点,而细节应该依赖于抽象。


依赖的三种方法

(1).构造函数
(2).接口方法(上述的例子)
(3).Setter方法


总结

根据依赖倒置原则,在编程中药做到如下几点:
(1).低层模块尽量都要有抽象类或接口,或者两者都有。
(2).变量的声明类型尽量是抽象类或接口。
(3).结合里氏替换原则,接口负责定义public属性和方法,并且声明与其他对象的依赖关系,抽象类负责公共构造部分的实现,实现类准确的实现业务逻辑,同时在适当的时候对父类进行细化。(引用的《设计模式之禅》)
本文参考的书籍有《设计模式之禅》以及网上博文。
大家可以关注我的微信公众号:「安卓干货铺」一个有质量、有态度的公众号!

相关文章

  • 依赖倒置原则

    个人博客原文:依赖倒置原则 设计模式六大原则之三:依赖倒置原则。 简介 姓名 :依赖倒置原则 英文名 :Depen...

  • 设计原则之6大原则

    目录:设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置...

  • 六大设计原则 -依赖倒置原则【Dependence Invers

    六大设计原则 单一职责原则 里式替换原则 依赖倒置原则 接口隔离原则 迪米特原则 开闭原则 依赖倒置原则 定义:高...

  • Java 依赖倒置 控制反转

    软件开发六大设计原则 合称SOLID 依赖倒置原则也是其中一个 依赖倒置原则定义: 上层模块不应该依赖底层模块,它...

  • 设计模式之代理模式(Proxy Pattern)

    设计模式中有六大原则和二十三设计模式。其中六大原则分别为:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口...

  • 设计模式之建造者模式(Builder)

    设计模式中有六大原则和二十三设计模式。其中六大原则分别为:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口...

  • 设计模式之单例模式(Singleton)

    设计模式中有六大原则和二十三设计模式。其中六大原则分别为:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口...

  • 设计模式之设计原则

    设计模式中有六大原则和二十三设计模式。 其中六大原则分别为:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接...

  • 设计模式之状态模式(State Pattern)

    设计模式中有六大原则和二十三设计模式。其中六大原则分别为:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口...

  • 设计模式之策略模式(Strategy Pattern)

    设计模式中有六大原则和二十三设计模式。其中六大原则分别为:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口...

网友评论

    本文标题:六大设计原则详解(3)-依赖倒置原则

    本文链接:https://www.haomeiwen.com/subject/jxnssxtx.html