前言
谈到面向对象,你要是只知道基础的话,你可能会说,不就是 封装、继承 、多态吗?
但是你仔细学习面向对象中你就会发现,面向对象也需要遵循类似MySQL的四要性。
废话不多说,我们今天来看看面向对象中的六大原则之一 —— 里氏替换原则
核心思想
原话是这样介绍的: 所有引用基类的地方必须能透明地使用其子类的对象
我们正常在开发中对于继承的使用,大多数都是由子类直接继承父类从而重写某个父类功能方法。
但是对于这种子类频繁重写父类方法的行为,会造成复用性变差,继承体系原先功能被破坏。
因此使用里氏替换原则的重要性就凸显出来了
以下是示例代码
示例代码
简单版
Goods.java 作为基类
/**
* @Author Marinda
* @Date 2022/12/17
* @Desc 物品
*/
public class Goods {
// 名称
private String name;
// 价格
private double price;
// 数量
private int amount;
// 材质
private String material;
public Goods(){
}
public Goods(String name,double price,int amount,String material){
this.name = name;
this.price = price;
this.amount = amount;
this.material = material;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public String getMaterial() {
return material;
}
public void setMaterial(String material) {
this.material = material;
}
}
Daily.java 作为子类继承Goods,并定义 useMode()
public class Daily extends Goods{
public Daily(){
}
/*
* 使用方式
*/
public void useMode(){
System.out.println("日用品的使用方式");
}
}
重点来了,新增纸类,并且内部定义Daily的实例化对象,在不破坏原先继承体系的情况下,重写了useMode方法
public class Paper extends Goods{
// 实例化日用品实体类
private Daily daily = new Daily();
public Paper(double price,int amount){
super("纸巾", price, amount, "木头");
}
/*
* 里氏替换原则 在不直接性重写其父类日用品的useMode方法。
* 改为集成基类重新实现一个useMode方法
* 并且能在当前纸类中内部透明的使用日用品实体类的对象
* 该行为名为:拓展
*/
public void useMode(){
System.out.println("家庭用纸");
}
public void userMode2(){
this.daily.useMode();
}
}
上面示例可以看出,纸和日用品分别为Goods的子类,但是纸在本文中定义属于日用品类。
继而实现useMode方法,并且内部拥有日用品的实例,在不破坏继承体系情况下重写了useMode方法。
没看懂?或者没思路?怎么用?
代码实战
商场示例代码实战
定义Market类
/**
* @Author Marinda
* @Date 2022/12/17
* @Desc 商场
*/
public class Market {
// 名称
private String name;
// 楼层数
private int floorNumber;
// 楼层对象列表
private List<Floor> floorList = new ArrayList<>();
public Market(){
}
public Market(int floorNumber){
this.floorNumber = floorNumber;
}
public Market(String name, int floorNumber){
this.name = name;
this.floorNumber = floorNumber;
}
public String getName() {
return name;
}
public int getFloorNumber() {
return floorNumber;
}
public void setFloorNumber(int floorNumber) {
this.floorNumber = floorNumber;
}
public void setName(String name) {
this.name = name;
}
public List<Floor> getFloorList() {
return floorList;
}
public void setFloorList(List<Floor> floorList) {
if(floorList.size() > floorNumber){
System.out.println("超出该商场最大楼层");
return;
}
this.floorList = floorList;
}
}
Goods类,作为商品基类
/**
* @Author Marinda
* @Date 2022/12/17
* @Desc 物品
*/
public class Goods {
// 名称
private String name;
// 价格
private double price;
// 数量
private int amount;
// 材质
private String material;
public Goods(){
}
public Goods(String name,double price,int amount,String material){
this.name = name;
this.price = price;
this.amount = amount;
this.material = material;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public String getMaterial() {
return material;
}
public void setMaterial(String material) {
this.material = material;
}
}
定义楼层类:Floor
/**
* @Author Marinda
* @Date 2022/12/17
* @Desc 楼层
*/
public class Floor extends Market {
private List<Goods> goodsList = new ArrayList<>();
public Floor(){
}
public Floor(int floorNumber){
super(floorNumber);
}
public List<Goods> getGoodsList() {
return goodsList;
}
public void setGoodsList(List<Goods> goodsList) {
this.goodsList = goodsList;
}
}
定义日用品类
/**
* @Author Marinda
* @Date 2022/12/17
* @Desc 楼层
*/
public class Floor extends Market {
private List<Goods> goodsList = new ArrayList<>();
public Floor(){
}
public Floor(int floorNumber){
super(floorNumber);
}
public List<Goods> getGoodsList() {
return goodsList;
}
public void setGoodsList(List<Goods> goodsList) {
this.goodsList = goodsList;
}
}
定义纸张类
public class Paper extends Goods{
// 实例化日用品实体类
private Daily daily = new Daily();
public Paper(double price,int amount){
super("纸巾", price, amount, "木头");
}
/*
* 里氏替换原则 在不直接性重写其父类日用品的useMode方法。
* 改为集成基类重新实现一个useMode方法
* 并且能在当前纸类中内部透明的使用日用品实体类的对象
* 该行为名为:拓展
*/
public void useMode(){
System.out.println("家庭用纸");
}
public void userMode2(){
this.daily.useMode();
}
}
控制台
// 定义超市名称 和总楼层数
Market market = new Market("鸡你太美商场",5);
List<Floor> floorList = new ArrayList<>();
// 楼层
Floor floor = new Floor(1);
List<Goods> floorGoodsList = new ArrayList<>();
// 纸巾
Paper paper = new Paper(15.00,100);
// 纸巾用法
paper.useMode();
// 在纸巾里使用日用品的方法
paper.userMode2();
// 把纸巾商品添加该楼层售卖
floorGoodsList.add(paper);
// 楼层添加商品列表数据
floor.setGoodsList(floorGoodsList);
// 楼层列表添加楼层数据
floorList.add(floor);
// 商品设置楼层对象列表
market.setFloorList(floorList);
System.out.println("欢迎来到" + market.getName()+",该商场最大楼层为:"+ market.getFloorNumber());
结果
家庭用纸
日用品的使用方式
欢迎来到鸡你太美商场,该商场最大楼层为:5
结束语
Java学习笔记 —— 面向对象六大原则之里氏替换原则实战
- 如果对你有帮助的话可以给我点赞收藏,十分感谢
- 致力做优、好、细、精学习笔记分享给大家
- 可以转载 需标明 出处 本文链接。
感谢你的观看。