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学习笔记 —— 面向对象六大原则之里氏替换原则实战

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

感谢你的观看。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值