目录

  • 概念
  • 实例
    • 代码实例
    • 需求变更
    • 开闭原则的实现
    • 源码

概念

  • 开闭原则的定义: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.什么是开闭原则         "开-闭"原则是指软件实体应当对扩展性开放,对修改关闭.即软件实体应该在不修改的前提下扩展,这个原则实际上为软件设计指明了目标.我们知道软件设计 ...

  2. 带你认识六种设计原则(开闭原则、里氏代换原则、依赖倒转原则....)

    前言 1. 设计原则 1.1. 开-闭原则 1.2. 里氏代换原则 1.3. 依赖倒转原则 1.4. 接口隔离原则 1.5. 合成/聚合原则 1.6. 迪米特法则 前言 学习设计模式之前先要了解其中的 ...

  3. 六大设计原则--开闭原则

    定义 software entities like classes, modules and functions should be open for extension but closed for ...

  4. 一周技术学习笔记(第67期)-CPU的设计跟开闭原则有关系吗

    你能想到CPU的设计是开闭原则的设计吗 说CPU的设计很符合软件设计的开闭原则,估计一般的同学肯定不会这样意识到.其实我也一样不太可能把它们能够想在一起,并将它们关联起来. 可确实就这样发生了.实际上 ...

  5. 六大设计模式原则-开闭原则

    一.开闭原则定义 开闭原则是面向对象的可复用设计的第一块基石,是最重要的面向对象设计原则.定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修 ...

  6. 设计模式6大原则-开闭原则

    设计模式6大原则-开闭原则 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 开闭原则理念就是当需求改变时,希望在不改变原有代码的前提下,通过扩展模块.函数来满足新需求. 开闭原则是其他 ...

  7. 设计模式之王者原则 开闭原则

    设计模式之王者原则  开闭原则 为什么说 它--开闭原则是王者原则呢? 因为所有原则都是围绕它来实现的,怎么说呢,为什么会有这么多原则呢,都是为了完成它,只要实现它你的代码就不会有什么大的问题 一.定 ...

  8. 【设计模式】软件设计七大原则 ( 开闭原则 )

    文章目录 一.开闭原则简介 二.开闭原则代码示例 1.商品接口 2.普通商品类 3.折扣商品类 4.测试类 一.开闭原则简介 开闭原则 : 定义 : 一个 软件实体 , 类 / 模块 / 函数 , 对 ...

  9. 软件设计原则——开闭原则

    开闭原则 对扩展开放,对修改关闭. 在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果.简言之,是为了使程序的扩展性好,易于维护和升级. 想要达到这样的效果,我们需要使用接口和抽象类 ...

  10. 设计一个扩展自抽象类geometricobject的新的triangle类_面向对象设计原则之开放封闭原则(开闭原则OCP)...

    (1) 定义 一个软件实体(类.模块.函数等),对于扩展是开放的,对于更改是封闭的. 对于扩展是开放的:这意味着模块的行为是可以扩展的.当应用的需求发生改变时,我们可以对模块进行扩展,比如增加新的类或 ...

最新文章

  1. OpenGL 三角形要点总结
  2. assign与weak区别(面试)
  3. WPF中XAML中使用String.Format格式化字符串示例
  4. git 推送出现 fatal: The remote end hung up unexpectedly 解决方案
  5. 2019年10月江苏计算机二级C语言编程题解析
  6. 微软行星云计算Planetary Computer——行星计算机数据资源管理器介绍!和GEE有啥不同?
  7. 为什么不要用System.out.println()
  8. ibeacon UWB GPS 空间四点定位算法
  9. mern技术栈好处?_如何开始使用MERN堆栈
  10. ANS.1的基础总结
  11. MySQL定位慢查询步骤
  12. oc-分类(catgory)的概念及使用
  13. 列表排序-第14届蓝桥杯STEMA测评Scratch真题精选
  14. ML-降维:PCA、SVD、LDA、MDS、LLE、LE算法总结
  15. 互联网究竟是怎么诞生的?
  16. 数加使用自定义调度资源进行数据同步
  17. ajax怎么解决报414,关于c#:HTTP错误414。请求URL太长。 asp.net
  18. Java软件开发实习生面试题总结
  19. wamp server下bugzilla的安装与配置
  20. 长短时记忆神经网络python代码_人工智能之长短时记忆神经网络

热门文章

  1. python中心性评价_centrality 计算复杂网络中的节点或边 数中心性,基于python的 工具箱 matlab 238万源代码下载- www.pudn.com...
  2. intval()很重要
  3. linux服务器系统安装
  4. [Go语言入门] 07 Go语言字符串
  5. 恋恋有词 - 高频版
  6. 详细探究一下何为数字孪生技术,它的来源与价值又为何?
  7. 【通信系统仿真系列】基于Matlab的汉明码(Hamming Code)纠错传输以及交织编码(Interleaved coding)仿真
  8. ie httpwatch抓包
  9. 频谱分析仪是什么?以及频谱分析仪的应用领域及工作原理
  10. Java中extends 与 implement 区别