我的博客原文:
里氏替换原则java
设计模式六大原则之二:里氏替换原则。git
姓名 :里氏替换原则github
英文名 :Liskov Substitution Principle设计模式
座右铭 :框架
If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
若是对每个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的全部程序P在全部的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。测试
Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
全部引用基类的地方必须能透明地使用其子类的对象。翻译
这 2 个定义来自《设计模式之禅》,比较干巴巴,不认真思考起来可能不太容易懂。简单来讲就是定义了什么是父子。在现实生活中,什么是父子?就是生你的那个男人和你的关系就是父子(父女)。而这里定义的就是假如 A 能胜任 B 干的全部事情,那 B 就是 A 的父亲,也就是儿子要会父亲的全部能活,儿子活得再烂也要有父亲的水平。设计
价值观 :很显然,比较传统,严父出孝子。儿子必需要有父亲的能耐,最好青出于蓝胜于蓝。code
伴侣 :估计有个贤惠的老婆,才能有这么优秀的儿子。对象
我的介绍 :我比较严厉,也是为了生存没办法,只有一辈一辈地变优秀,一直坚持下去,家族就会愈来愈好。这样就能够富过三代,你看大家人类不是常常说富不过三代。。。扎心了老铁,老子仍是富零代。
里氏替换原则定义了什么是父子,还有一点要注意的,就是儿子不能在父亲会的技能上搞“创新”。
好比父亲会作红烧排骨,儿子在新东方烹饪学校中学到了一招,在红烧排骨里面加糖和醋,变成红烧糖醋排骨,更加美味,看代码,儿子在父亲的基础红烧排骨上加了糖醋,好像没啥问题。
class Father1 { public void braisedRibs(){ System.out.println("红烧排骨"); } } class Son1 extends Father1 { public void braisedRibs(){ System.out.println("红烧糖醋排骨"); } }
运行下面代码,会打印:红烧排骨
Father1 father1 = new Father1(); father1.braisedRibs();
咱们上面说过,全部在使用父亲的地方,都可以替换成儿子,而且效果是同样的,那接下来咱们改一下代码。
Son1 son1 = new Son1(); son1.braisedRibs();
结果是啥?打印出:红烧糖醋排骨,出乎意料吧。。。这结果彻底不同。想一下上面说的:老爸会的老子也要会,很明显,上面的例子老子不会红烧排骨,只会红烧糖醋排骨,因此这根本不是父子关系。
那应该怎么实现呢?其实红烧排骨和红烧糖醋排骨这压根就是 2 道菜,你去餐馆吃饭的时候,你点红烧排骨服务员给你送来红烧糖醋排骨,或者你点红烧糖醋排骨服务员给你送来红烧排骨,你这时候不生气,算我输。
来看看 Son2,Son2 将红烧糖醋改成 braisedSweetAndSourPorkRibs (翻译很差找 Google 算帐去哈,反正不是我翻译的)。
class Son2 extends Father1 { public void braisedSweetAndSourPorkRibs(){ System.out.println("红烧糖醋排骨"); } }
测试一下是否是好儿子
Son2 son2 = new Son2(); son2.braisedRibs(); son2.braisedSweetAndSourPorkRibs();
打印出:
红烧排骨
红烧糖醋排骨
这才是 Father1 的好儿子嘛,不只会红烧排骨,还会红烧糖醋排骨。因此说里氏替换原则就是在定义父子关系,你们都遵照这个定义,就会一代比一代好,不遵照你们也看到了,把前辈传下来的都毁于一旦了。
代码见:LSPTest.java
下面再贴一下书本上的一些优缺点
好了,里氏替换原则的大概原理讲得差很少,你们只要记住是在定义“父子关系”,就像游戏规则同样,定义后让你们遵照,会让你们的程序在后面愈来愈复杂的时候也能清晰,而不会愈来愈乱。
参考资料:《大话设计模式》、《Java设计模式》、《设计模式之禅》、《研磨设计模式》、《Head First 设计模式》
但愿文章对您有所帮助,设计模式系列会持续更新,感兴趣的同窗能够关注公众号,第一时间获取文章推送阅读,也能够一块儿交流,交个朋友。