设计模式实践 - 依赖倒转、里氏替换原则

依赖倒转(倒置)原则:

A.高层模块不应该依赖于低层模块,两个都应该依赖于抽象;
B.抽象不应该依赖细节,细节应该依赖抽象。(针对接口编程,不要针对实现编程)

依赖倒转 其实可以说是面向对象设计的标志。如果编写程序的时候,都是考虑的如何针对抽象编程而不是细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之就是面向过程化的设计了。

在实际编程中,我们一般需要做到如下3点:

  1. 低层模块尽量都要有抽象类或接口,或者两者都有。
  2. 变量的声明类型尽量是抽象类或接口。
  3. 使用继承时遵循里氏替换原则。

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

里氏替换原则:

  • 定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。

  • 定义2:所有引用基类的地方必须能透明地使用其子类的对象。(子类型必须能够替换掉他们的父类型)

里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。它包含以下4层含义:

  1. 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
  2. 子类中可以增加自己特有的方法。
  3. 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
  4. 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

只有当子类可以替换掉父类,软件单位的功能不受影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
正是由于子类型的可替换性,才使得使用父类型的模块在无需修改的情况下就可以扩展。

你可能感兴趣的:(设计模式实践 - 依赖倒转、里氏替换原则)