LSP & DIP & ISP
LSP:里式替换原则
子类型必须能够替换掉他们的基类型
在继承关系中,子类对父类的继承除了字段、属性,还有方法,而使同一方法在子类中表现出不同的行为是通过多态表现的,具体在语言上的操作上表现为父类提供虚函数,而在子类中覆写该虚函数,这是抽象机制的重要基础。
采用里氏替换原则时,尽量避免子类的“个性”,一旦子类有“个性”,这个子类和父类之间的关系就很难调和了,把子类当做父类使用,子类的“个性”被抹杀——委屈了点;把子类单独作为一个业务来使用,则会让代码间的耦合关系变得扑朔迷离,缺乏类替换的标准。
实现开闭原则的关键步骤是抽象化,父类与子类之间的继承关系就是抽象化的体现,因此里氏替换原则是实现开闭原则的具体步骤规范。
DIP:依赖倒置原则 (Dependence Inversion Principle):高层模块不应该依赖底层模块,都应该依赖于抽象;抽象不应该依赖于具体,具体依赖于抽象。
若高层依赖于底层,那么底层的变动也会导致高层的变动,这就会导致模块的复用性降低而且大大提高了开发的成本。若是依赖于抽象的话,那么是比较稳定的,底层或者高层的变动都不会互相影响。
ISP:接口隔离原则
如果类的接口定义暴露了过多的行为,则说明这个类的接口定义内聚程度不够好。也就是说,类的接口可以被分解为多组功能函数的组合,不同的客户类可以选择不同的功能接口。
不应该强迫客户依赖它们不用的方法,臃肿的接口会导致客户程序之间产生一些不必要的耦合关系,当一个臃肿的接口发生改变时,那么会影响到它所有的子类的实现。所以客户只需要实现它自己所需要的方法就够了,这样使得客户类之间减少不必要的依赖。