当前位置:   article > 正文

大话设计模式-里氏代换原则

大话设计模式-里氏代换原则

里氏代换原则(Liskov Substitution Principle,LSP)

概念

里氏代换原则是面向对象设计的基本原则之一,由美国计算机科学家芭芭拉·利斯科夫(Barbara Liskov)提出。这个原则定义了子类型之间的关系,确保在软件中,我们可以将父类对象替换为子类对象,而不会影响程序的正确性。它在原文中的定义是这样的:如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。

简单来说,就是子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能 P2 外,还要保证通过重写父类的方法完成原有功能 P1 时,子类的方法行为要和父类的一致。

而在Java中,我们通常通过继承来创建子类。根据里氏代换原则,我们需要确保子类的行为和父类的行为一致。这意味着:

  1. 子类可以增加新的方法,但是不能覆盖父类的方法改变原有的行为。
  2. 子类可以覆盖父类的方法改进原有的行为,但是结果应该和父类的结果一致。

优缺点

遵循LSP的优点:

  1. 增强可扩展性:如果子类能够替换父类而不改变程序的行为,那么我们可以在不修改现有代码的情况下,通过添加新的子类来扩展系统的功能。
  2. 提高代码的可读性和可维护性:遵循LSP可以使代码更容易理解和维护。因为如果子类和父类的行为一致,那么我们就可以理解子类的行为,而不需要查看子类的实现。
  3. 提高代码的复用性:如果子类可以替换父类,那么我们可以在不同的上下文中复用父类和子类,而不需要担心它们的行为不一致。

违反LSP的坏处:

  1. 破坏封装性:如果子类改变了父类的行为,那么使用父类的代码可能会因为子类的行为不一致而出错。这就破坏了封装性,使得代码的维护变得困难。
  2. 增加代码的复杂性:如果子类和父类的行为不一致,那么我们在理解和使用这些类时,就需要考虑它们的差异,这会增加代码的复杂性。
  3. 降低代码的可扩展性:如果子类改变了父类的行为,那么我们在扩展系统功能时,就需要考虑这些行为的差异,这会降低代码的可扩展性。

例子

假设我们有一个父类Bird和一个子类Penguin

class Bird {
    void fly() {
        System.out.println("I can fly");
    }
}

class Penguin extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException("Penguins can't fly");
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这个例子中,PenguinBird的子类,但是它覆盖了fly方法并抛出了异常,因为企鹅不能飞。这违反了里氏代换原则,因为我们不能将Bird对象替换为Penguin对象而不改变程序的行为。
通常来讲,里氏代换原则和依赖倒置原则二者相辅相成,依赖倒置原则也叫依赖倒转原则,在我们后续的文章中有详细介绍。
总的来说,遵循里氏代换原则可以帮助我们设计出更健壮、可维护和可扩展的系统。而违反这个原则可能会导致代码的复杂性增加,维护和扩展变得困难。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/467065
推荐阅读
相关标签
  

闽ICP备14008679号