七大设计原则(一):开闭原则
参考慕课网视频《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,自撰一函数,用之,堆栈溢出。
七大设计原则(一):开闭原则相关推荐
- 设计模式-软件架构设计七大原则及开闭原则详解
前言 在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题.为了解决.克服这个难题,Remi酱特别开了这个博客来记录自己 ...
- 七大设计原则之开闭原则
一.开闭原则介绍 开闭原则(Open Closed Principle)是编程中最基础,也是最重要的设计原则.编程中遵循其他原则以及使用设计模式的目的就是遵循开闭原则. 一个软件实体如类,模块和函数应 ...
- Java设计原则之单一职责原则、开闭原则、里氏代换原则
文章目录 面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 面向对象设计原则概述 软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量 ...
- 设计原则:开闭原则(OCP)
1.什么是开闭原则 开闭原则的英文是Open Closed Principle,缩写就是OCP.其定义如下: 软件实体(模块.类.方法等)应该"对扩展开放.对修改关闭". 从定义上 ...
- 设计模式-02.经典设计原则-第一节-单一职责原则,开闭原则,里式替换,接口隔离【万字长文系列】
文章目录 设计模式经典设计原则-第一节 单一职责原则(SRP) 如何理解单一职责原则? 如何判断类的职责是否足够单一? 类的职责是否设计得越单一越好? 开闭原则(OCP) 如何理解"对扩展开 ...
- [设计原则] 六大设计原则之“开闭原则”
[设计原则] 六大设计原则之"开闭原则" 目录 [设计原则] 六大设计原则之"开闭原则" 什么是开闭原则 为什么使用开闭原则 如何使用开闭原则 注意事项 总结 ...
- Java面向对象设计原则1——开闭原则
在我们学习面向对象编程的时候,总会出现一些问题,好比以前刚刚写好的代码,上线测试可以.正常运行,突然有一天说要加一个功能,改完之后,发现以前正常运行的功能不能用了,类似这样的问题有好多好多,为了避免类 ...
- 设计模式六大原则之--开闭原则(OCP)
设计模式六大原则之--开闭原则(OCP) 前言 1 描述 2 理解: 3 问题由来: 4 使用LoD的好处: 5 难点: 6 最佳实践: 7 范例: 前言 The Open - Closed Prin ...
- 关于Java面向对象程序设计原则之一——开闭原则的思考与分享
整理日期:2022-05-27 目录 一.开闭原则 二.为什么使用开闭原则 三.如何在程序设计中体现开闭原则 一.开闭原则 开闭原则(Open-Closed Principle, OCP)是指一个软件 ...
- 源码分析七大设计原则之开闭原则(Open Close Principle)
源码分析之七大设计原则 一.开闭原则(Open Close Principle) 定义:软件实体应当对扩展开放,对修改关闭,即:软件系统中包含的各种组件,例如模块(Modules).类(Classes ...
最新文章
- Linux查看系统开机时间(转)
- 企业信息化投入中咨询服务_企业信息化咨询中的问题与对策研究
- Python高阶函数用法
- 笨方法学python3怎么样_抖音笨李白是什么歌 抖音笨李白歌曲歌词介绍
- java验证生日的正则表达式
- C# TreeNode的使用方法
- 为什么Spark能成为最火的大数据计算引擎?它是怎样工作的?
- 信息学奥赛一本通 1979:【18NOIP普及组】龙虎斗 | 洛谷 P5016 [NOIP2018 普及组] 龙虎斗
- 德国人认真起来,自己都怕!
- 怎么向Xcode6 IOS8之后向项目中添加预编译文件
- UI中经常出现的下拉框下拉自动筛选效果的实现
- Canvas 图片加载
- python 识别汉字、数字、字母,实现半角及全角之间的转换
- Mysql数据表存在一对多数据合并
- android persist属性使用
- HTML5游戏开发案例教程
- 云计算对电子商务的应用优势
- 搜索引擎关键词优化可以怎么做?
- 大学人机交互课小组作业(刚入坑菜鸟一枚,求别喷吼吼)
- 数据分析的统计基础(下)