Java学习笔记 —— 面向对象六大原则之里氏替换原则实战

Java学习笔记 —— 面向对象六大原则之里氏替换原则实战

前言

谈到面向对象,你要是只知道基础的话,你可能会说,不就是 封装继承多态吗?
但是你仔细学习面向对象中你就会发现,面向对象也需要遵循类似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学习笔记 —— 面向对象六大原则之里氏替换原则实战

  • 如果对你有帮助的话可以给我点赞收藏,十分感谢
  • 致力做学习笔记分享给大家
  • 可以转载 需标明 出处 本文链接。

感谢你的观看。

猜你喜欢

转载自blog.csdn.net/qq_33638188/article/details/128352971
今日推荐