java面向对象设计原则之里氏替换原则示例详解

 更新时间:2021年10月14日 10:32:11   作者:guoyp2126  
这篇文章主要为大家介绍了java面向对象设计原则之里氏替换原则示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪

概念

里氏替换原则是任何基类出现的地方,子类一定可以替换它;是建立在基于抽象、多态、继承的基础复用的基石,该原则能够保证系统具有良好的拓展性,同时实现基于多态的抽象机制,能够减少代码冗余。

实现

里氏替换原则要求我们在编码时使用基类或接口去定义对象变量,使用时可以由具体实现对象进行赋值,实现变化的多样性,完成代码对修改的封闭,扩展的开放。如:商城商品结算中,定义结算接口Istrategy,该接口有三个具体实现类,分别为PromotionalStrategy (满减活动,两百以上百八折)、RebateStrategy (打折活动)、 ReduceStrategy(返现活动);

public interface Istrategy {
    public double realPrice(double consumePrice);
}
public class PromotionalStrategy implements Istrategy {
    public double realPrice(double consumePrice) {
        if (consumePrice > 200) {
            return 200 + (consumePrice - 200) * 0.8;
        } else {
            return consumePrice;
        }
    }
}
public class RebateStrategy implements Istrategy {
    private final double rate;
    public RebateStrategy() {
        this.rate = 0.8;
    }
    public double realPrice(double consumePrice) {
        return consumePrice * this.rate;
    }
}
public class ReduceStrategy implements Istrategy {
    public double realPrice(double consumePrice) {
        if (consumePrice >= 1000) {
            return consumePrice - 200;
        } else {
            return consumePrice;
        }
    }
}

调用方为Context,在此类中使用接口定义了一个对象。其代码如下:

public class Context {
    //使用基类定义对象变量
    private Istrategy strategy;
    // 注入当前活动使用的具体对象
    public void setStrategy(Istrategy strategy) {
        this.strategy = strategy;
    }
    // 计算并返回费用
    public double cul(double consumePrice) {
        // 使用具体商品促销策略获得实际消费金额
        double realPrice = this.strategy.realPrice(consumePrice);
        // 格式化保留小数点后1位,即:精确到角
        BigDecimal bd = new BigDecimal(realPrice);
        bd = bd.setScale(1, BigDecimal.ROUND_DOWN);
        return bd.doubleValue();
    }
}

Context 中代码使用接口定义对象变量,这个对象变量可以是实现了lStrategy接口的PromotionalStrategy、RebateStrategy 、 ReduceStrategy任意一个。

拓展

里氏替换原则和依赖倒置原则,构成了面向接口编程的基础,正因为里氏替换原则,才使得程序呈现多样性。

以上就是java面向对象设计原则之里氏替换原则示例详解的详细内容,更多关于java面向对象设计里氏替换原则的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Spring简单容器中的Bean基本加载过程

    详解Spring简单容器中的Bean基本加载过程

    本篇将对定义在 XMl 文件中的 bean,从静态的的定义到变成可以使用的对象的过程,即 bean 的加载和获取的过程进行一个整体的了解
    2017-05-05
  • Java实现多线程的n种方法

    Java实现多线程的n种方法

    在现代编程中,多线程是一项关键技术,它使得程序能够同时执行多个任务,提高了系统的效率和性能,在Java中,有多种方法可以实现多线程,本文将详细介绍几种常见的Java多线程实现方法,需要的朋友可以参考下
    2024-11-11
  • springmvc 参数绑定总结

    springmvc 参数绑定总结

    本篇文章主要介绍了详解springmvc 参数绑定,详细的介绍了springmvc各种参数绑定的情况,具有一定的参考价值,有兴趣的可以了解一下。
    2017-03-03
  • Java中如何正确重写equals方法

    Java中如何正确重写equals方法

    Object类中equals方法比较的是两个对象的引用地址,只有对象的引用地址指向同一个地址时,才认为这两个地址是相等的,否则这两个对象就不相等
    2021-10-10
  • Spring@Autowired与@Resource的区别有哪些

    Spring@Autowired与@Resource的区别有哪些

    这篇文章主要为大家详细介绍了@Autowired与@Resource的区别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 用java实现杨辉三角的示例代码

    用java实现杨辉三角的示例代码

    本篇文章主要介绍了用java实现杨辉三角的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Java图片读取ImageIO.read()报错问题及解决

    Java图片读取ImageIO.read()报错问题及解决

    在使用imageio库读取图片时,如果路径中包含中文,可能会导致读取失败,解决方法是将路径中的中文字符进行转义处理,可以使用ImageUtil.java工具类进行路径转义,从而避免错误,这是一个常见问题,希望本文的解决方案能帮助到遇到相同问题的开发者
    2024-10-10
  • 教你利用JAVA实现可以自行关闭服务器的方法

    教你利用JAVA实现可以自行关闭服务器的方法

    今天给大家带来的是关于Java的相关知识,文章围绕着利用JAVA实现可以自行关闭服务器的方法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • spring @schedule注解如何动态配置时间间隔

    spring @schedule注解如何动态配置时间间隔

    这篇文章主要介绍了spring @schedule注解如何动态配置时间间隔,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 深入理解spring的AOP机制原理

    深入理解spring的AOP机制原理

    本篇文章主要介绍了深入理解spring的AOP机制原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论