Java23种设计模式七大原则--里氏替换原则

目录

一.定义:

二.作用:  

1.实现开闭原则重要方式之一

2.克服继承中重写父类的可复用性变差的缺点

3.它是动作正确性的保证。

4.加强程序的健壮性,同时变更时可以做到非常好的兼容性,提高程序的维护性、可扩展性,降低需求变更时引入的风险。

三.实现方法:

四.代码演示

1.基类父类:

2.子类继承父类:

3.调用测试:

4.结果:


一.定义:

里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstraction and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)。

里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中蕴含的原理。里氏替换原是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。

 

二.作用:  

1.实现开闭原则重要方式之一

开闭原则:开启拓展,关闭修改

2.克服继承中重写父类的可复用性变差的缺点

不改变父类的原有功能,子类进行外部业务拓展

3.它是动作正确性的保证。

即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。

4.加强程序的健壮性,同时变更时可以做到非常好的兼容性,提高程序的维护性、可扩展性,降低需求变更时引入的风险。

 

三.实现方法:

里氏替换原则通俗来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。

重写父类的方法来完成新的功能写起来虽然简单,但是整个继承体系的可复用性会比较差,特别是运用多态比较频繁时,程序运行出错的概率会非常大。

根据上述理解,对里氏替换原则的定义可以总结如下:

  • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
  • 子类中可以增加自己特有的方法
  • 当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松
  • 当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的的输出/返回值)要比父类的方法更严格或相等

如果程序违背了里氏替换原则,则继承类的对象在基类出现的地方会出现运行错误。这时其修正方法是:取消原来的继承关系,重新设计它们之间的关系。 

 在设计原则上出发,根据某一角度来组合继承关系,比如:父类是动物,那么鱼和猫都可以继承动物类   但是如果父类是会游泳的动物,那么猫类是无法继承父类的,这个要做区分

 

四.代码演示

1.基类父类:

package com.zking.design.lsp;

/**
 * @description:里氏替换原则--父类
 * @author: codinglife
 * @time: 2021/5/7 14:53
 */
public  class WindowsSubject {
    int size;

    /**
     * 设置主题
     * @param size
     */
    public void setSubjectSize(int size) {
        this.size=size;
    }

    /**
     * 当前windows属性
     * @param attrName 属性名称
     */
    public String attr(String attrName) {
        return attrName+"大小:"+this.size;
    }
    
}

2.子类继承父类:

package com.zking.design.lsp;

/**
 * @description: 里氏替换原则--Windows颜色
 * @author: codinglife
 * @time: 2021/5/6 10:35
 */
public class WindowsColorSubject extends WindowsSubject{

    //该子类不重写父类

    /**
     * Windows颜色自己方法sayHello    (子类中可以增加自己特有的方法)
     * @param
     */
    public void sayHello(){
        System.out.println("Windows颜色自己方法sayHello");
    }


}
package com.zking.design.lsp;

/**
 * @description:里氏替换原则--Windows声音
 * @author: codinglife
 * @time: 2021/5/6 10:51
 */
public class WindowsVoiceSubject extends  WindowsSubject{

  /**
   * 对父类方法的重写
   * @param size
   * @param name  (当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松)
   */
    public void setSubjectSize(int size,String name) {
        super.size=size/2;
    }
}

3.调用测试:

package com.zking.design.lsp;


/**
 * @description: 里氏替换原则--测试
 * @author: codinglife
 * @time: 2021/5/6 10:54
 */
public class SubjectMain {

    public static void main(String[] args) {
        WindowsSubject windowsColorSubject= new WindowsColorSubject(); //颜色
        WindowsSubject windowsVoiceSubject= new WindowsVoiceSubject(); //声音


        //子类重写父类方法进行拓展
        windowsColorSubject.setSubjectSize(200);  //颜色200
        windowsVoiceSubject.setSubjectSize(100);  //声音50


        System.out.println(windowsColorSubject.attr("颜色"));  //颜色200
        System.out.println(windowsVoiceSubject.attr("声音"));  //声音50


    }


}

4.结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值