`
vking_wang
  • 浏览: 10461 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

六大设计原则总结:3)依赖倒置原则 -Dependence Inversion Principle:

 
阅读更多

DIP,Dependence Inversion Principle:

High level modules should not depend upon low level modules. Both should depend upon abstractions.

Abstractions should not depend upon details. Details should depend upon abstractions.


即“面向接口编程”:

  • 高层模块不应该依赖低层模块,两者都应该依赖其抽象;——模块间的依赖通过抽象发生。实现类之间不发生直接的依赖关系(eg. 类B被用作类A的方法中的参数),其依赖关系是通过接口或抽象类产生的;
  • 抽象不应该依赖细节;——接口或抽象类不依赖于实现类;
  • 细节应该依赖抽象;——实现类依赖接口或抽象类。

何为“倒置”?

依赖正置:类间的依赖是实实在在的实现类间的依赖,即面向实现编程,这是正常人的思维方式;

而依赖倒置是对现实世界进行抽象,产生了抽象间的依赖,代替了人们传统思维中的事物间的依赖。


依赖倒置可以减少类间的耦合性、降低并行开发引起的风险。


示例(减少类间的耦合性):

例如有一个Driver,可以驾驶Benz:

public class Driver{
    public void drive(Benz benz){
        benz.run();
    }
}
public class Benz{
    public void run(){
        System.out.println("Benz开动...");
    }
}

问题来了:现在有变更,Driver不仅要驾驶Benz,还需要驾驶BMW,怎么办?

Driver和Benz是紧耦合的,导致可维护性大大降低、稳定性大大降低(增加一个车就需要修改Driver,Driver是不稳定的)。


示例(降低并行开发风险性):

如上例,Benz类没开发完成前,Driver是不能编译的!不能并行开发!


问题由来:

类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。


解决办法:

将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。


上例中,新增一个抽象ICar接口,ICar不依赖于BMW和Benz两个实现类(抽象不依赖于细节)。

1)Driver和ICar实现类松耦合

2)接口定下来,Driver和BMW就可独立开发了,并可独立地进行单元测试


依赖有三种写法:

1)构造函数传递依赖对象(构造函数注入)

public interface IDriver{
    public void drive();
}

public class Driver implements IDriver{
    private ICar car;

    public Driver(ICar _car){
        this.car = _car;
    }

    public void drive(){
        this.car.run();
    }
}

2)setter方法传递依赖对象(setter依赖注入)

public interface IDriver{
    public void setCar(ICar car);
    public void drive();
}

public class Driver implements IDriver{
    private ICar car;
    public void setCar(ICar car){
        this.car = car;
    }
    public void drive(){
        this.car.run();
    }
}

3)接口声明依赖对象(接口注入)


建议:

DIP的核心是面向接口编程;DIP的本质是通过抽象(接口、抽象类)使各个类或模块的实现彼此独立,不互相影响。

在项目中遵循以下原则:

  1. 每个类尽量都有接口或抽象类
  2. 变量的表面类型尽量使接口或抽象类
  3. 任何类都不应该从具体类派生*
  4. 尽量不要重写父类中已实现的方法
  5. 结合里氏替代原则使用



分享到:
评论

相关推荐

    面向对象设计原则-依赖倒置原则示例源码

    依赖倒置原则(Dependence Inversion Principle),缩写为DIP。原始定义:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend ...

    面向对象六大设计原则

    3、依赖倒置原则(Dependence Inversion Principle,DIP) 4、接口隔离原则(Interface Separate Principle,ISP) 5、合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP) 6、迪米特法则(Law of ...

    程序设计六大原则及代码样例

    这六个原则包括单一职责原则(Single Responsibility Principle, SRP)、里氏替换原则(Liskov Substitution Principle, LSP)、依赖倒置原则(Dependence Inversion Principle, DIP)、接口隔离原则(Interface ...

    六大设计原则.docx

    LoD)、接口隔离原则(Interface Segregation Principle,ISP)以及依赖倒置原则(Dependence Inversion Principle,DIP)。这些原则旨在提升代码的可维护性、灵活性和扩展性。 **单一职责原则(SRP)**: SRP规定...

    Java面向对象设计原则.docx

    原则5: 依赖注入或倒置原则 Dependence Inversion Principle(DIP) “设计要依赖于抽象而不是具体化”。换句话说就是设计的时候我们要用抽象来思考,而不是一上来就开始划分我需要哪些哪些类,因为这些是具体的。...

    软件开发设计原则

    6. 依赖倒置原则(Dependence Inversion Principle - DIP) 依赖倒置原则是指高层模块不应该依赖于低层模块,它们应该依赖于抽象的接口。抽象的接口不应该依赖于细节,细节应该依赖于抽象的接口。 在实际应用中,...

    软件设计的七大原则(OOD)

    五、DIP(Dependence Inversion Principle):依赖倒置原则 DIP是软件设计的七大原则之一,它的定义是:高层模块不应该依赖于低层模块,而应该依赖于抽象。DIP可以提高软件模块的可重用性和可维护性,减少软件系统...

    软件架构设计的6大原则.pdf

    6. 依赖倒置原则(Dependence Inversion Principle - DIP) 依赖倒置原则是指高层模块不应该依赖于低层模块,它们应该依赖于抽象。这个原则强调了抽象的重要性和面向接口编程的必要性,防止类之间的紧耦合。应用时...

    程序设计的七大原则

    #### 三、依赖倒置原则 (Dependence Inversion Principle) 依赖倒置原则的核心思想是高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。这意味着我们应该尽可能地...

    24种设计模式介绍与6大设计原则

    3. 依赖倒置原则(Dependence Inversion Principle, DIP):高层模块不应该依赖于低层模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。 4. 接口隔离原则(Interface Segregation Principle...

    依赖倒转原则

    依赖倒置原则(Dependence Inversion Principle,简称DIP)这个名字看着有点别扭,“依赖”还“倒置”,这到底是什么意思?依赖倒置原则的原始定义是:High level modules should not depend upon low level modules...

    七大原则&&六大关系

    #### 三、依赖倒置原则 (Dependence Inversion Principle, DIP) **定义:** 依赖倒置原则要求高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。简单地说,就是面向...

    java23种设计模式详细讲解

    - 依赖倒置原则(Dependence Inversion Principle):高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。 - 接口隔离原则(Interface Segregation Principle):客户端不应...

    软件设计原则.pptx

    4. **依赖倒置原则 (Dependence Inversion Principle, DIP)**:高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。这通常通过使用接口或抽象类实现,从而...

    设计模式:Java语言中的应用.zip

    - 依赖倒置原则(Dependence Inversion Principle,DIP):高层模块不应该依赖低层模块,两者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。 - 接口隔离原则(Interface Segregation Principle,ISP):...

    Java设计模式-23种设计模式详解

    4. 依赖倒置原则(Dependence Inversion Principle):上层模块不应该依赖底层模块,它们都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。 5. 接口隔离原则(Interface Segregation Principle):...

    JavaCodeDesign:这是Java设计模式的样本项目

    依赖倒置原则 dip(Dependence Inversion Principle) 4. 接口隔离原则 isp(interface-segregation principles) 5. 迪米特法则 lod(Least Knowledge Principle) 6. 开闭原则 ocp 设计模式 (pattern) 1. 单例模式 ...

    Java 66 道面试题及答案.docx

    3. 依赖倒置原则(Dependence Inversion Principle):依赖倒置原则的核心思想是面向接口编程。 4. 接口隔离原则(Interface Segregation Principle):使用多个隔离的接口,比使用单个接口要好。 5. 迪米特法则...

Global site tag (gtag.js) - Google Analytics