深入浅出设计模式——里氏替换原则

Posted 苏凌峰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出设计模式——里氏替换原则相关的知识,希望对你有一定的参考价值。

1.里氏替换原则介绍

2.用代码演示里氏替换原则

3.总结

1.里氏替换原则介绍

定义:
1)如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
2)所有引用基类的地方必须能透明地使用其子类的对象。

我们看到这里时可能看不太懂,简而言之就是当使用继承的时候,比如类B继承类A,除了添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也不要重载父类A的方法。

问题描述:我相信我们都用过ORM框架,比如mybatis,jpa等等。这里我们拿jpa举例,假设jpa基类中,有一个封装好的findAll()方法,是获取所有的数据,但是我们在子类(自己的service)中,给它重写成了只获取当前操作者的所有数据,这样乍一看没什么问题,但是如果先有人写好了使用findAll()方法并且稳定运行的代码,被后续的人修改了业务逻辑,就会造成异常。

解决方法:
子类可以扩展父类的功能,但不能改变父类原有的功能,不要去重写,重载父类的功能。

2.用代码演示依赖倒转原则

假设我们现在有这么一个方法:

public interface JpaRepository {
//默认是取出所有数据
List<T> findAll();
}

假设A同事使用了上述方法进行开发,并且代码已经稳定运行了,但是B同事在自己的代码里覆盖了这个方法:

public interface UserRepository extends JpaRepository {

    //只查询状态不被禁用的用户
    @Query(value = "select * from user where status = 1")
    List<User> findAll();

}

这就会导致原来运行好的程序出现了bug,严重点的可能会报空指针异常或者逻辑错误等等问题。

3.总结

当使用继承时,遵循里氏替换原则。除了添加新的方法完成功能外,不要去重写父类A的方法,也不要重载父类A的方法。

继承虽然好用,但是用不好就会出现大量问题,并且在写代码的时候要考虑到,修改父类后,是不是所有子类的功能会受到影响。

以上是关于深入浅出设计模式——里氏替换原则的主要内容,如果未能解决你的问题,请参考以下文章

设计模式软件设计七大原则 ( 里氏替换原则 | 代码示例 | 类示例 | 方法入参示例 | 方法返回值示例 )

java设计模式3,里氏替换原则

设计模式-----里氏替换原则

设计模式六大原则:里氏替换原则

深入理解JavaScript系列:S.O.L.I.D五大原则之里氏替换原则LSP

设计模式 里氏替换原则