学习设计模式 - 六大基本原则之里氏替换原则
设计模式总共有六大基本原则,统称为SOLID (稳定)原则,分别是S-单一职责原则(Single Responsibility Principle), O-开闭原则(Open closed Principle),L-里氏替换原则(Liskov Substitution Principle),L-迪米特法则(Law of Demeter),I-接口隔离原则(Interface Segregation Principle),D-依赖倒置原则(Dependence Invension Principle)。
L-里氏替换原则(Liskov Substitution Principle)
一、定义
所有引用基类的地方,都必须能透明的使用其子类的对象(Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it)。
二、理解
凡是父类出现的地方,子类就可以出现,并且不会出现任何错误或异常。这个原则的用意是在告诫我们,子类继承父类要完全可以承担父类的职责,当一个子类不能完全实现父类的业务逻辑时,需要使用依赖、聚集、组合等关系替代。里氏替换原则是实现依赖倒置原则的重要保障。
三、如何使用里氏替换原则
使用里氏替换原则,我们要牢牢把握住里氏替换原则的核心——凡是父类出现的地方,子类就可以出现,并且不会出现任何错误和异常。当我们用子类代替父类的位置时,我们需要考虑父类方法参数当做子类方法参数是否合适、子类方法输出结果是否在父类方法输出结果范围之内、子类方法实现是否可以完全实现父类的方法。所以,里氏替换原则有如下使用准则:
1. 子类必须完全实现父类的方法
2. 子类可以有自己的行为与外观
3. 覆盖或实现父类的方法输入参数可以被放大
4. 覆写或实现父类的方法时输出结果可以被缩小
四、注意事项
采用里氏替换原则的目的就是增强程序的健壮性,版本升级时也可以保持非常好的兼容性,即时增加子类,原有的子类还可以继续运行。在实际项目中,每个子类对应不同的业务含义,使用父类作为参数,传递不同的子类完成不同的业务逻辑。
在项目中,采用里氏替换原则时,尽量避免子类的“个性”。一旦子类拥有了“个性”,父子关系就难以调和。一方面,如果把子类当做父类使用,子类的“个性”就会被抹杀;另一方面,如果把子类单独作为一个业务使用,就会让代码间的耦合关系变得扑朔迷离,缺乏类替换的标准。
学习资料:
《设计模式之禅》秦小波 著