[设计模式]设计模式之依赖倒置原则

面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变化时,上层也要跟着变化,这就会导致模块的复用性降低而且大大提高了开发的成本。 面向对象的开发很好的解决了这个问题,一般的情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变化,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序域实现细节的耦合度。

依赖倒置—依赖注入,控制反转

如果一个==类A的功能实现需要借助于类B==,那么就称类B是类A的依赖,
如果在类A的内部去实例化类B,那么两者之间会出现较高的耦合,
一旦类B出现了问题,类A也需要进行改造,如果这样的情况较多,
每个类之间都有很多依赖,那么就会出现牵一发而动全身的情况,
程序会极难维护,并且很容易出现问题。
要解决这个问题,就要把A类对B类的控制权抽离出来,交给一个第三方去做,
把控制权反转给第三方,就称作控制反转(IOC Inversion Of Control)。
控制反转是一种思想,是能够解决问题的一种可能的结果,
而依赖注入(Dependency Injection)就是其最典型的实现方法
。由第三方(我们称作IOC容器)来控制依赖,
把他通过构造函数、属性或者工厂模式等方法,注入到类A内,
这样就极大程度的对类A和类B进行了解耦。

IOC (Inversion of Control) 控制反转

遵循依赖倒置原则的一种代码设计方案,依赖的创建 (控制) 由主动变为被动 (反转)。上述的第三方。

DIP (Dependence Inversion Principle)依赖倒置原则

程序要依赖于抽象接口,不要依赖于具体实现。依赖注入是该原则的一种实现方式
1. 高层模块不应该依赖于低层模块,二者都应该依赖于抽象
2. 抽象不应该依赖于细节,细节应该依赖于抽象

依赖倒置的具体的表现:

  1. 模块间的依赖通过抽象发生,实现类之间不直接发生依赖关系。(依赖关系通过接口或者抽象类)
  2. 接口或者抽象类不依赖于实现类。实现类依赖接口 或者 抽象类

上面提到的可以用一句话概括,面向接口编程(面向对象设计的精髓)
要理解 “面向接口编程” 的真正意思——针对超类型编程面向接口编程,关键就在实现多态,和能利用多态,程序可以针对超类型编程,执行时会根据实际状况执行到真正的行为,不会被绑死在超类型的行为上。

优点:

  1. 采用依赖倒置原则,可以减少类之间的耦合性。提高系统的稳定性,提高可读性和可维护性。
  2. 当需求的变更时,最终只需要修改高层的业务场景类(也就是调用的地方)

抽象更深入的理解:
1. 抽象是对实现的约束,对实现者而言,是一种契约(约束作用)
2. 约束自己也约束别人,保证双方按照契约(抽象)就行开发

DI (Dependency Injection) 依赖注入

依赖注入是控制反转的一种具体实现方法。通过参数的方式从外部传入依赖,将依赖的创建由主动变为被动 (实现了控制反转)
1. 构造函数,传递依赖对象 例如:public Driver( ICar_car){}
2. 通过setter 方法 例如:public void setCar(ICar_car){}
3. 接口声明 例如:public class Benz implements ICar{}

依赖倒置原则的核心就是要我们面向接口编程,理解了面向接口编程,也就理解了依赖倒置。

发布了449 篇原创文章 · 获赞 180 · 访问量 87万+

猜你喜欢

转载自blog.csdn.net/ouyangshima/article/details/92077554