参考慕课网视频《Java设计模式精讲》:
视频作者:Geely
视频链接:https://coding.imooc.com/lesson/270.html#mid=17147

定义

一个软件实体,如类、模块、函数应该对扩展开放,对修改关闭。

强调

用抽象构建框架,用实现扩展细节。
ps:抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节,我们用从抽象派生的实现类来进行扩展,当软件需要发生变化时,我们只需要根据需求重新派生一个实现类来扩展就可以了。

优点

提高软件系统的可复用性及可维护性。

就用简洁的代码实现开闭原则。

定义一个接口。

package com.qfcwx.openclose;/*** @ClassName: Course* @Author: 清风一阵吹我心* @Description: TODO* @Date: 2019/4/7 16:29* @Version 1.0**/
public interface Book {/*** 获取id** @return*/Long getId();/*** 获取名称** @return*/String getName();/*** 获取价格** @return*/Double getPrice();}

接着定义其实现类

package com.qfcwx.openclose;/*** @ClassName: JavaBook* @Author: 清风一阵吹我心* @Description: TODO* @Date: 2019/4/7 16:31* @Version 1.0**/
public class JavaBook implements Book {private Long id;private String name;private Double price;public JavaBook(Long id, String name, Double price) {this.id = id;this.name = name;this.price = price;}@Overridepublic Long getId() {return this.id;}@Overridepublic String getName() {return this.name;}@Overridepublic Double getPrice() {return this.price;}
}

接下来编写测试类

package com.qfcwx.openclose;import org.junit.Test;/*** @ClassName: MainTest* @Author: 清风一阵吹我心* @Description: TODO 测试类* @Date: 2019/4/7 16:36* @Version 1.0**/
public class MainTest {@Testpublic void testMethod1() {Book book = new JavaBook(110L, "《Java编程思想》", 78D);System.out.println(book.getName() + "这本书值得每一个开发者反复品读" + ",书的编号是" + book.getId() + ",售价" + book.getPrice());}
}

使用的junit测试,代码很简单,通过构造函数初始化数据,然后赋值,打印值。
倘若,我们要获取这本书的打折价格怎么办。是直接修改接口?还是直接在实现类中增加新的方法?
当对接口修改的时候,破坏了其稳定性。而且所有实现它的子类,都要进行修改,不利于代码的维护。
所以,我们可以创建一个JavaBook的子类。给它添加一个打折的方法。

package com.qfcwx.openclose;/*** @ClassName: JavaDiscountBook* @Author: 清风一阵吹我心* @Description: TODO 打折后的价格* @Date: 2019/4/7 16:46* @Version 1.0**/
public class JavaDiscountBook extends JavaBook {public JavaDiscountBook(Long id, String name, Double price) {super(id, name, price);}/*** 打折** @return*/public Double getDiscountPrice() {return super.getPrice() * 0.8;}
}

新增测试方法。

    @Testpublic void testMethod2() {Book book = new JavaDiscountBook(110L, "《Java编程思想》", 88D);JavaDiscountBook javaDiscountBook = (JavaDiscountBook) book;System.out.println(javaDiscountBook.getName() + "这本书值得每一个开发者反复品读" + ",书的编号是" + javaDiscountBook.getId() + ",售价" + javaDiscountBook.getPrice() + ",京东618活动,打折后只售" + javaDiscountBook.getDiscountPrice());}

第一行代码是向上转型,即父类的引用指向了子类对象。向上转型后父类引用不能调用子类自己的方法,所以,需要向下转型,才能调用打折后的方法。
第二行就是子类向下转型。

基本上开闭原则就简单的实现了,如果需要更深层次的理解,还需要多看书,多看源码,多动手。

程序员,年二十有三,头秃,始从文,连考而不中。遂习武,练武场上发一矢,中鼓吏,逐之出。改学IT,自撰一函数,用之,堆栈溢出。

七大设计原则(一):开闭原则相关推荐

  1. 设计模式-软件架构设计七大原则及开闭原则详解

    前言 在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题.为了解决.克服这个难题,Remi酱特别开了这个博客来记录自己 ...

  2. 七大设计原则之开闭原则

    一.开闭原则介绍 开闭原则(Open Closed Principle)是编程中最基础,也是最重要的设计原则.编程中遵循其他原则以及使用设计模式的目的就是遵循开闭原则. 一个软件实体如类,模块和函数应 ...

  3. Java设计原则之单一职责原则、开闭原则、里氏代换原则

    文章目录 面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 面向对象设计原则概述 软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量 ...

  4. 设计原则:开闭原则(OCP)

    1.什么是开闭原则 开闭原则的英文是Open Closed Principle,缩写就是OCP.其定义如下: 软件实体(模块.类.方法等)应该"对扩展开放.对修改关闭". 从定义上 ...

  5. 设计模式-02.经典设计原则-第一节-单一职责原则,开闭原则,里式替换,接口隔离【万字长文系列】

    文章目录 设计模式经典设计原则-第一节 单一职责原则(SRP) 如何理解单一职责原则? 如何判断类的职责是否足够单一? 类的职责是否设计得越单一越好? 开闭原则(OCP) 如何理解"对扩展开 ...

  6. [设计原则] 六大设计原则之“开闭原则”

    [设计原则] 六大设计原则之"开闭原则" 目录 [设计原则] 六大设计原则之"开闭原则" 什么是开闭原则 为什么使用开闭原则 如何使用开闭原则 注意事项 总结 ...

  7. Java面向对象设计原则1——开闭原则

    在我们学习面向对象编程的时候,总会出现一些问题,好比以前刚刚写好的代码,上线测试可以.正常运行,突然有一天说要加一个功能,改完之后,发现以前正常运行的功能不能用了,类似这样的问题有好多好多,为了避免类 ...

  8. 设计模式六大原则之--开闭原则(OCP)

    设计模式六大原则之--开闭原则(OCP) 前言 1 描述 2 理解: 3 问题由来: 4 使用LoD的好处: 5 难点: 6 最佳实践: 7 范例: 前言 The Open - Closed Prin ...

  9. 关于Java面向对象程序设计原则之一——开闭原则的思考与分享

    整理日期:2022-05-27 目录 一.开闭原则 二.为什么使用开闭原则 三.如何在程序设计中体现开闭原则 一.开闭原则 开闭原则(Open-Closed Principle, OCP)是指一个软件 ...

  10. 源码分析七大设计原则之开闭原则(Open Close Principle)

    源码分析之七大设计原则 一.开闭原则(Open Close Principle) 定义:软件实体应当对扩展开放,对修改关闭,即:软件系统中包含的各种组件,例如模块(Modules).类(Classes ...

最新文章

  1. Linux查看系统开机时间(转)
  2. 企业信息化投入中咨询服务_企业信息化咨询中的问题与对策研究
  3. Python高阶函数用法
  4. 笨方法学python3怎么样_抖音笨李白是什么歌 抖音笨李白歌曲歌词介绍
  5. java验证生日的正则表达式
  6. C# TreeNode的使用方法
  7. 为什么Spark能成为最火的大数据计算引擎?它是怎样工作的?
  8. 信息学奥赛一本通 1979:【18NOIP普及组】龙虎斗 | 洛谷 P5016 [NOIP2018 普及组] 龙虎斗
  9. 德国人认真起来,自己都怕!
  10. 怎么向Xcode6 IOS8之后向项目中添加预编译文件
  11. UI中经常出现的下拉框下拉自动筛选效果的实现
  12. Canvas 图片加载
  13. python 识别汉字、数字、字母,实现半角及全角之间的转换
  14. Mysql数据表存在一对多数据合并
  15. android persist属性使用
  16. HTML5游戏开发案例教程
  17. 云计算对电子商务的应用优势
  18. 搜索引擎关键词优化可以怎么做?
  19. 大学人机交互课小组作业(刚入坑菜鸟一枚,求别喷吼吼)
  20. 数据分析的统计基础(下)

热门文章

  1. Win10任务栏软件图标变成白色如何解决?
  2. win10 任务栏图标变为空白、图标丢失的解决方法
  3. 【图像分割】基于matlab HSV彩色空间图像分割【含Matlab源码 1474期】
  4. 修复 Rancher 2.5.x 内部证书过期导致无法启动的顽疾
  5. 运行 RoCEv2 的网络注意事项
  6. 【美团】职级、薪酬、绩效全认知
  7. 统计学(五):非参数检验
  8. React Native Firebase
  9. 一分钟弄懂什么是分布式和微服务
  10. MySQL数据库的完全卸载