当前位置:首页 > java知识学习_java技术文章 > 正文

java设计模式中里氏替换原则全方位实例讲解

浏览1941+

一、里氏替换原则含义深刻理解

里氏替换原则是软件设计思想的基本原则之一,更是java 23种设计模式的具体实现,里氏代换原则中明确定义:任何引用基类的地方必须能透明的使用其子类的对象,如果有继承关系的情况下必须确保超类所拥有的性质在子类中仍然成立。

用通俗的话剖析其深刻含义可以这么理解:任何有父类的地方皆可完全透明的使用子类,代码中出现的所有父类都可以让其子类完全替代它,不影响任何功能和异常,但是任何子类却都不能让父类替代,并且子类可以所以扩展其父类的功能,但是子类不要修改父类的功能。

里氏替换原则中的继承类图

里氏替换原则的出现是为了解决继承关系中带来的类的耦合性以及父类对子类的约束性等问题,解决父类发生改变导致子类也更改的尴尬问题,只有当这种父子类的继承关系存在时,里氏代换关系才存在,否则就不会有里氏替换原则的出现。

二、里氏替换原则带来的具体优势作用

只要有继承关系就会有代码的侵入性,解决的代码的耦合度和侵入就会相应的增加程序的灵活度,明显的提升继承关系前提下的可复用性问题。

里氏替换原则是开闭原则的具体实现与补充,开闭原则讲究扩展开放修改关闭,映射到里氏替换原则中的对父类扩展严禁修改的观点。

解放了类的扩展性,类无论怎样扩展都会保证正确性不会带来新错误,代码的出错误几率大大降低。

三、里氏替换原则的弊端与约束

子类使用父类非私有的属性和行为时,按照里氏代换原则的规定,只能重写父类规定的抽象方法,不能够重写其它公有方法。

当子类重写抽象方法时,方法参数需比父类宽松,返回值需比父类严谨。 不然将会调用到父类中的方法中去。

四、里氏替换原则具体实例例子与代码案例

奇异鸟与燕子实例类图

我们以鸟类为具体案例将里氏替换原则的抽象转换为容易理解的代码,如上图中的类图所示,鸟类通常以每小时约120公里的速度飞翔,例如燕子。 但是新西兰的奇异鸟无法飞翔,因为它们的翅膀已经变质。 如果要设计一个示例,请计算两只鸟飞行300公里需要多长时间。 显然,如果用燕子执行这个代码,结果是正确的,并且可以计算所需的时间。 但是,当测试奇异鸟时,结果要么是“除以零例外”,要么是“无穷大”,这显然不是预期的结果。

奇异鸟和燕子计算300公里所需时间的代码如下:

package principle;
public class LSPtest
{
    public static void main(String[] args)
    {
        Bird bird1=new Swallow();
        Bird bird2=new BrownKiwi();
        bird1.setSpeed(120);
        bird2.setSpeed(120);
        System.out.println("如果飞行300公里:");
        try
        {
            System.out.println("燕子将飞行"+bird1.getFlyTime(300)+"小时.");
            System.out.println("奇异鸟将飞行"+bird2.getFlyTime(300)+"小时。");
        }
        catch(Exception err)
        {
            System.out.println("发生错误了!");
        }
    }
}
//鸟类
class Bird
{
    double flySpeed;
    public void setSpeed(double speed)
    {
        flySpeed=speed;
    }
    public double getFlyTime(double distance)
    {
        return(distance/flySpeed);
    }
}
//燕子类
class Swallow extends Bird{}
//奇异鸟类
class BrownKiwi extends Bird
{
    public void setSpeed(double speed)
    {
           flySpeed=0;
    }
}

奇异鸟和燕子代码运行结果

根据上图展示的运行结果,奇异鸟不具备飞行能力,重写了鸟类的速度方法,违背了里氏替换原则,奇异鸟的飞行速度是0,当计算奇异鸟的飞行时间时程序就出现了除数不能为0的错误,故无法计算飞行时间。

遵循里氏替换原则修改后的燕子和奇异鸟的类图

上图是我们遵循里氏替换原则对燕子和奇异鸟的类图进行了正确的修改,燕子和奇异鸟不能同时继承父类飞行的方法,奇异鸟不能飞行,但是我们可以同时计算燕子300公里的飞行时间和奇异鸟奔跑300公里的奔跑时间。

将原先的继承关系撤销掉,增加一个动物类,动物类描述动物的普遍通用的行为,比如计算时间和速度的方法,鸟类和奇异鸟分别继承动物类,这样燕子能够计算飞行时间,奇异鸟能够计算奔跑时间,同时又避免了重写父类的方法,符合里氏替换原则的标准。

五、多态的实现是否违反里氏替换原则

多态的实现是父类的引用指向子类的实现,比如:接口与实现类的方式就是多态的最常见的具体体现,那么就会有人有疑问?多态是重写父类的方法而里氏替换原则是避免重写父类方法,那岂不是冲突吗?

其实并非冲突,只是没弄清两者的概念而已,多态实际上也是重写的父类的抽象方法,里氏替换原则也是如此,刚好吻合,并没有任何冲突行为。

六、里氏代换原则还能重写吗?

里氏代换原则规定子类不得重写父类的普通方法,只能重写父类的抽象方法,程序员们实际设计软件时如果非要继承的话,设计继承抽象类,而不要继承普通类。

 

相关文章推荐

里氏替换原则的优点,理解,以及使用

第五课 多态概念、里氏替换原则

依赖倒置原则

里氏替换原则举例子说明

里氏替换原则阐述什么道理——面向对象设计原则

设计模式里氏替换原则继承优缺点子类必须完全实现父类的方法

里氏替换原则的概念

控制反转和依赖注入的理解(通俗易懂)

里氏代换原则 举例 分析

百度云网盘视频教程分享

责任声明:文章信息由IT教程屋小编精心整理总结编排而成,倾注了心血和汗水,转载时请遵循行业规范务必注明文章作者、来源及本页链接,谢谢合作!
本篇文章标题:java设计模式中里氏替换原则全方位实例讲解
本篇文章url地址:http://www.itjcw123.cn/2358.html