深入浅出设计模式——里氏替换原则
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 = "https://www.it610.com/article/select * from user where status = 1")
List findAll();
}
这就会导致原来运行好的程序出现了bug,严重点的可能会报空指针异常或者逻辑错误等等问题。
3.总结
当使用继承时,遵循里氏替换原则。除了添加新的方法完成功能外,不要去重写父类A的方法,也不要重载父类A的方法。
【深入浅出设计模式——里氏替换原则】继承虽然好用,但是用不好就会出现大量问题,并且在写代码的时候要考虑到,修改父类后,是不是所有子类的功能会受到影响。
推荐阅读
- 急于表达——往往欲速则不达
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 2019-02-13——今天谈梦想()
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- Ⅴ爱阅读,亲子互动——打卡第178天
- 低头思故乡——只是因为睡不着
- 取名——兰
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议
- 广角叙述|广角叙述 展众生群像——试析鲁迅《示众》的展示艺术