博主介绍: ✌博主从事应用安全和大数据领域,有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());
}
}
💕💕 本文由激流丶创作,原创不易,感谢支持!
💕💕喜欢的话记得点赞收藏啊!