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

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 findAll();
}

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

public interface UserRepository extends JpaRepository {

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

}

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

3.总结

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

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

你可能感兴趣的:(java设计模式里氏替换原则)