设计原则 - 开闭原则
目录
- 概念
- 实例
- 代码实例
- 需求变更
- 开闭原则的实现
- 源码
概念
- 开闭原则的定义:Open-Closed Principle,OCP,一个软件实体应当对扩展开放,对修改关闭。
- 开闭原则的中心思想:用抽象构建框架,用实现扩展细节。
- 开闭原则的优点:提高软件系统的可复用性及可维护性
- 实现开闭原则的核心思想:面向抽象编程。
- 一句话理解:软件实现应对扩展开放,对修改关闭
实例
代码实例
- 以慕课网课程举例
ICourse.java
/*** @Description 课程* @date Aug 27, 2021* @Version 1.0*/
public interface ICourse {/*** 课程ID* @return*/Integer getId();/*** 课程名称* @return*/String getName();/*** 课程价格* @return*/Double getPrice();}
JavaCourse.java
/*** @Description Java课程* @date Aug 27, 2021* @Version 1.0*/
public class JavaCourse implements ICourse{private Integer id;private String name;private Double price;public JavaCourse(Integer id, String name, Double price) {this.id = id;this.name = name;this.price = price;}@Overridepublic Integer getId() {return this.id;}@Overridepublic String getName() {return this.name;}@Overridepublic Double getPrice() {return this.price;}
}
Test.java
/*** @Description 测试类* @date Aug 27, 2021* @Version 1.0*/
public class Test {public static void main(String[] args) {ICourse javaCourse1 = new JavaDiscountCourse(1, "Java开发",188d);System.out.println("课程ID:" + javaCourse1.getId()+ " 课程名称:" + javaCourse1.getName()+ " 课程价格:" + javaCourse1.getPrice());}
}
- 输出如下:
课程ID:1 课程名称:Java开发 课程价格:150.4
需求变更
- 需求变更:Java课程打⑧折
- 实现该需求可在
ICourse
中新增获取打折价格接口,JavaCourse
实现打⑧折,代码如下: ICourse.java
/*** 打折价格* @return*/
Double getDiscountPrice();
JavaCourse.java
@Override
public Double getDiscountPrice() {return this.getPrice() * 0.8;
}
- 可以实现,但每一次的扩展都需要变更
ICourse
接口,复用性和维护性较差
开闭原则的实现
JavaDiscountCourse.java
/*** @Description java折扣* @date Aug 27, 2021* @Version 1.0*/
public class JavaDiscountCourse extends JavaCourse {public JavaDiscountCourse(Integer id, String name, Double price) {super(id, name, price);}/*** 原价* @return*/public Double getOriginPrice() {return super.getPrice();}/*** add 打折场景* 折扣价* @return*/@Overridepublic Double getPrice() {return super.getPrice() * 0.8;}
}
Test.java
/*** @Description 开闭原则测试类* @date Aug 27, 2021* @Version 1.0*/
public class Test {public static void main(String[] args) {ICourse javaCourse1 = new JavaDiscountCourse(1, "Java开发",188d);System.out.println("课程ID:" + javaCourse1.getId()+ " 课程名称:" + javaCourse1.getName()+ " 课程价格:" + javaCourse1.getPrice());JavaDiscountCourse javaCourse2 = (JavaDiscountCourse) javaCourse1;System.out.println("课程ID:" + javaCourse2.getId()+ " 课程名称:" + javaCourse2.getName()+ " 课程原价:" + javaCourse2.getOriginPrice()+ " 课程折扣价:" + javaCourse2.getPrice());}}
- 输出如下:
课程ID:1 课程名称:Java开发 课程价格:150.4
课程ID:1 课程名称:Java开发 课程原价:188.0 课程折扣价:150.4
- 类图变化如下:
- 开闭原则的实现总结:接口没变,实现类没变,声明子类来继承实现类,通过继承基类使扩展开放,对修改接口和基类是关闭的,变化的都是应用层的子模块; 越基础的模块变化影响范围越大,越高层的模块变化影响范围越小。
- 在很多面向对象编程语言中都提供了接口、抽象类等机制,可以通过他们定义系统的抽象层,再通过具体类来进行扩展,如果需要修改系统的行为,无需对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统的功能,达到开闭原则的要求。
源码
GitHub
:https://github.com/Maggieq8324/design_pattern.git
- End - - 个人学习笔记 - - 仅供参考 -
设计原则 - 开闭原则相关推荐
- 面向对象软件设计的“开—闭”原则
1.什么是开闭原则 "开-闭"原则是指软件实体应当对扩展性开放,对修改关闭.即软件实体应该在不修改的前提下扩展,这个原则实际上为软件设计指明了目标.我们知道软件设计 ...
- 带你认识六种设计原则(开闭原则、里氏代换原则、依赖倒转原则....)
前言 1. 设计原则 1.1. 开-闭原则 1.2. 里氏代换原则 1.3. 依赖倒转原则 1.4. 接口隔离原则 1.5. 合成/聚合原则 1.6. 迪米特法则 前言 学习设计模式之前先要了解其中的 ...
- 六大设计原则--开闭原则
定义 software entities like classes, modules and functions should be open for extension but closed for ...
- 一周技术学习笔记(第67期)-CPU的设计跟开闭原则有关系吗
你能想到CPU的设计是开闭原则的设计吗 说CPU的设计很符合软件设计的开闭原则,估计一般的同学肯定不会这样意识到.其实我也一样不太可能把它们能够想在一起,并将它们关联起来. 可确实就这样发生了.实际上 ...
- 六大设计模式原则-开闭原则
一.开闭原则定义 开闭原则是面向对象的可复用设计的第一块基石,是最重要的面向对象设计原则.定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修 ...
- 设计模式6大原则-开闭原则
设计模式6大原则-开闭原则 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 开闭原则理念就是当需求改变时,希望在不改变原有代码的前提下,通过扩展模块.函数来满足新需求. 开闭原则是其他 ...
- 设计模式之王者原则 开闭原则
设计模式之王者原则 开闭原则 为什么说 它--开闭原则是王者原则呢? 因为所有原则都是围绕它来实现的,怎么说呢,为什么会有这么多原则呢,都是为了完成它,只要实现它你的代码就不会有什么大的问题 一.定 ...
- 【设计模式】软件设计七大原则 ( 开闭原则 )
文章目录 一.开闭原则简介 二.开闭原则代码示例 1.商品接口 2.普通商品类 3.折扣商品类 4.测试类 一.开闭原则简介 开闭原则 : 定义 : 一个 软件实体 , 类 / 模块 / 函数 , 对 ...
- 软件设计原则——开闭原则
开闭原则 对扩展开放,对修改关闭. 在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果.简言之,是为了使程序的扩展性好,易于维护和升级. 想要达到这样的效果,我们需要使用接口和抽象类 ...
- 设计一个扩展自抽象类geometricobject的新的triangle类_面向对象设计原则之开放封闭原则(开闭原则OCP)...
(1) 定义 一个软件实体(类.模块.函数等),对于扩展是开放的,对于更改是封闭的. 对于扩展是开放的:这意味着模块的行为是可以扩展的.当应用的需求发生改变时,我们可以对模块进行扩展,比如增加新的类或 ...
最新文章
- OpenGL 三角形要点总结
- assign与weak区别(面试)
- WPF中XAML中使用String.Format格式化字符串示例
- git 推送出现 fatal: The remote end hung up unexpectedly 解决方案
- 2019年10月江苏计算机二级C语言编程题解析
- 微软行星云计算Planetary Computer——行星计算机数据资源管理器介绍!和GEE有啥不同?
- 为什么不要用System.out.println()
- ibeacon UWB GPS 空间四点定位算法
- mern技术栈好处?_如何开始使用MERN堆栈
- ANS.1的基础总结
- MySQL定位慢查询步骤
- oc-分类(catgory)的概念及使用
- 列表排序-第14届蓝桥杯STEMA测评Scratch真题精选
- ML-降维:PCA、SVD、LDA、MDS、LLE、LE算法总结
- 互联网究竟是怎么诞生的?
- 数加使用自定义调度资源进行数据同步
- ajax怎么解决报414,关于c#:HTTP错误414。请求URL太长。 asp.net
- Java软件开发实习生面试题总结
- wamp server下bugzilla的安装与配置
- 长短时记忆神经网络python代码_人工智能之长短时记忆神经网络
热门文章
- python中心性评价_centrality 计算复杂网络中的节点或边 数中心性,基于python的 工具箱 matlab 238万源代码下载- www.pudn.com...
- intval()很重要
- linux服务器系统安装
- [Go语言入门] 07 Go语言字符串
- 恋恋有词 - 高频版
- 详细探究一下何为数字孪生技术,它的来源与价值又为何?
- 【通信系统仿真系列】基于Matlab的汉明码(Hamming Code)纠错传输以及交织编码(Interleaved coding)仿真
- ie httpwatch抓包
- 频谱分析仪是什么?以及频谱分析仪的应用领域及工作原理
- Java中extends 与 implement 区别