设计规则之里氏替换原则

简介: 设计规则之里氏替换原则

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

里氏替换原则

里氏替换原则 Liskov Substiution Principle ,简称 LSP。怎么理解这个原则呢,《设计模式之禅》第二章介绍它有两种定义:

1、If for each object ol of type S there is an object o2 oftype T such that for all programs P defined in terms of T, the behavior of P is unchangedwhen o1 is substituted for o2 then S is a subtype of T.
如果对每一个类型为S的对象ol,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。

这句话有点晦涩,简单来说就是 T 是父类,S 是子类,在一段代码中,将 T 替换成 S ,代码的逻辑并没发生任何变化。

2、Functions that use pointers or references to base classes must be able to useobjects of derived classes without knowing it. 所有引用基类的地方必须透明的使用其子类的对象。
这句话的意思呢,跟上面的差不多,就父类出现的地方,换成子类,代码不会异常,但是如果反过来,子类出现的地方,要是换成父类,那么就有可能出错了。

参考下面的例子:
我们可以将保时捷换成法拉利,并没有改变 User 类的代码逻辑,依然是先 先点火,在驾驶,这就是里氏替换原则的第一个定义。

package com.pany.camp.design.principle.lsp;

/**
 *
 * @description:  车子的抽象类
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: panyong 
 * @version: 1.0.0 
 * @createTime: 2023-05-31 13:26
 */
public abstract class Car {
   
   

    /**
     * 启动
     *
     * @since 1.0.0
     * @param
     * @return: void
     * @author: panyong
     * @version: 1.0.0
     * @createTime: 2023-05-31 13:28
     */
    abstract void firing();

    /**
     * 车子的牌子
     *
     * @since 1.0.0
     * @param
     * @return: String
     * @author: pany
     * @version: 1.0.0
     * @createTime: 2023-05-31 13:36
     */
    abstract String getName();
}
package com.pany.camp.design.principle.lsp;
/**
 *
 * @description:  保时捷
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-05-31 13:30
 */
public class Porsche extends Car {
   
   

    @Override
    void firing() {
   
   
        System.out.println("drive porsche");
    }

    @Override
    String getName() {
   
   
        return "porsche";
    }
}
package com.pany.camp.design.principle.lsp;

/**
 *
 * @description: 法拉利
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-05-31 13:40
 */
public class Ferrari extends Car {
   
   
    @Override
    void firing() {
   
   
        System.out.println("drive ferrari");
    }

    @Override
    String getName() {
   
   
        return "ferrari";
    }
}
package com.pany.camp.design.principle.lsp;

public class User {
   
   

    public void drive(Car car) {
   
   
        car.firing();
        System.out.println("drive " + car.getName());
    }

    public static void main(String[] args) {
   
   
        User user = new User();

        // 我可以换成其他的方式,并没有改变代码的逻辑
        user.drive(new Porsche());
        user.drive(new Ferrari());
    }
}

1686494501743.jpg

💕💕 本文由激流丶创作,原创不易,感谢支持!
💕💕喜欢的话记得点赞收藏啊!

目录
相关文章
|
Java
六大设计原则-里式替换原则【Liskov Substitution Principle】
六大设计原则-里式替换原则【Liskov Substitution Principle】
35 0
|
6月前
|
C# 开发者 索引
C# 11.0中的所需成员:强化接口与抽象类的约束
【1月更文挑战第24天】C# 11.0引入了所需成员(Required members)的概念,这一新特性允许在接口和抽象类中定义必须被实现的成员,包括方法、属性、索引器和事件。通过所需成员,C# 强化了对接口实现和抽象类继承的约束,提高了代码的一致性和可维护性。本文将详细探讨C# 11.0中所需成员的工作原理、使用场景及其对现有编程模式的影响。
|
设计模式 安全 Java
设计规则之开闭原则
设计规则之开闭原则
87 0
设计规则之开闭原则
|
安全 Java 大数据
设计规则之单一职责原则
设计规则之单一职责原则
78 0
设计规则之单一职责原则
|
前端开发 Java BI
继承是代码复用的最佳方案吗?
继承,一个父类可有许多个子类。父类就是把一些公共代码放进去,之后在实现其他子类时,少写一些代码。 代码复用,很多人觉得继承就是绝佳方案。若把继承理解成代码复用,更多是站在子类角度向上看。在客户端代码使用时,面对的是子类,这种继承叫实现继承
159 0
|
设计模式
【设计模式】软件设计七大原则 ( 里氏替换原则 | 定义 | 定义扩展 | 引申 | 意义 | 优点 )
【设计模式】软件设计七大原则 ( 里氏替换原则 | 定义 | 定义扩展 | 引申 | 意义 | 优点 )
210 0
|
算法 关系型数据库 数据库
面向对象基本原则(3)- 最少知道原则与开闭原则
面向对象基本原则(1)- 单一职责原则与接口隔离原则 面向对象基本原则(2)- 里式代换原则与依赖倒置原则 面向对象基本原则(3)- 最少知道原则与开闭原则
面向对象基本原则(1)- 单一职责原则与接口隔离原则
面向对象基本原则(1)- 单一职责原则与接口隔离原则 面向对象基本原则(2)- 里式代换原则与依赖倒置原则 面向对象基本原则(3)- 最少知道原则与开闭原则
面向对象基本原则(2)- 里式代换原则与依赖倒置原则
面向对象基本原则(1)- 单一职责原则与接口隔离原则 面向对象基本原则(2)- 里式代换原则与依赖倒置原则 面向对象基本原则(3)- 最少知道原则与开闭原则
|
搜索推荐
# 设计原则与思想--- 里式替换原则(LSP)与多态的区别
# 设计原则与思想--- 里式替换原则(LSP)与多态的区别