依赖倒转原则(又叫依赖倒置原则):抽象不应该依赖细节,细节应该依赖抽象。也就是要针对接口编程,不要针对现实编程。
例如,电脑的主板、CPU、内存、硬盘都是针对接口设计的,当其中一样出现故障时,只需要替换出现故障的部件。如果针对实现来设计,内存就要对应到具体的某个品牌的主板,那么就会出现换内存需要把主板也换了的麻烦。
依赖倒转原则 A.高层模块不应该依赖低层模块。两个都应该依赖抽象。 B.抽象不应该依赖细节。细节应该依赖抽象。
在实现依赖倒转原则时必须满足里氏代换原则。
里氏代换原则(LSP):子类型必须能够替换掉它们的父类型。
里氏代换原则:一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成了它的子类,程序的行为没有变化。正是因为里氏代换原则的子类型可替换性才使得父类型的模块在无需修改的情况下就可以扩展,也是开放-封闭原则的基础。
例如,在生物学上的分类,企鹅是一种鸟。在面向对象的编程中,鸟类是会飞的,如果企鹅继承了鸟类,则企鹅具有飞的行为,显然违背了且不能飞的现实,所以在面向对象的编程过程中,企鹅不能继承鸟类。
如果抽象类为动物,猫是动物类的子类,以动物的身份具有吃、喝、跑、叫等行为。当我们需要狗、牛、羊也需要类似的行为,它们直接继承动物类,除了实例化的地方需要更改,程序的其他地方不需要修改。