一、开闭原则定义:

一个软件实体如类、模块、函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现实现细节。

  • 也就是说我们如果想实现某种变化,不应该修改原类或模块实现相应的功能细节,而是对原类或模块实体进行扩张 继承来具体实现某一变化。
  • 一个软件实体在使用过程中许多模块都会不断发生变化,以修改某商品价格为例,如果频繁修改原功能模块,则需要频繁打包上架重启,开闭原则可以提高软件系统的可复用性、灵活性和可维护性。
下面我们用一个例子来理解开闭原则:
先写一个课程接口,定义公共使用的方法
/*** 定义个课程接口,定义公共行为方法* getName() 课程名称* getPrice() 课程价格*/
public interface ICourse {Integer getId();String  getName();Double getPrice();
}
实现一个java课程类实现公共课程接口
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;}public Integer getId() {return id;}public String getName() {return name;}public Double getPrice() {return price * 0.8;//常规修改下的课程价格打8折}
}
写一个main方法测试类

在main方法中初始化一个java课程信息并输出

public class OpenCourseTest {public static void main(String[] args) {ICourse course = new JavaCourse(1,"javaEE",99D);System.out.println("课程ID:" + course.getId() +"\n课程名称:《" + course.getName() +"》" +"\n课程价格:" + course.getPrice());}
}
得到如下结果
课程ID:1
课程名称:《javaEE》
课程价格:79.2
  • 这样写暴露出一个问题,就是每次使用不同的折扣都需要修改一次JavaCourse类,可能就会造成频繁的原逻辑修改,在复杂的业务中容易出问题。
  • 此时,原来的代码我们就不要去修改了,关闭原来代码的修改,扩展原代码,通过继承原代码类实现需求细节的修改。让我们的项目代码风险可控。
我们重写一个打折类,在类中实现细节:
public class JavaDiscountCourse extends JavaCourse{public JavaDiscountCourse(Integer id, String name, Double price) {super(id, name, price);}//修改后的价格 可加入其他业务逻辑public Double getDisCountPrice() {return super.getPrice() * 0.6;//打6折}
}
再修改main测试类
public class OpenCourseTest {public static void main(String[] args) {ICourse course = new JavaDiscountCourse(1,"javaEE",99D);System.out.println("课程ID:" + course.getId() +"\n课程名称:《" + course.getName() +"》" +"\n课程原价:" + course.getPrice() +"\n课程折价:" + ((JavaDiscountCourse)course).getDisCountPrice());}
}
得到结果如下:
课程ID:1
课程名称:《javaEE》
课程原价:99.0
课程折价:59.4
  • 现在打折例子完成了,我们只是增加了一个JavaDiscountCourse 类,我们没有修改底层模块,代码改变量少,可以有效的防止风险的扩散。
  • 如果要修改代码中某些逻辑实现细节的变化,尽量避开低层代码的逻辑,如果要修改低层代码,你要确定都有哪些高层次的代码使用了这些低层次代码,做统一的修改,低层次的代码的修改,肯定会引起高层次引用代码的变化,牵一发而动全身。所以尽量使用开闭原则,对原低层次代码进行扩展实现。
  • 开闭原则是最基础的设计原则,其他五个原则都是以开闭原则为基础,你也可以这么理解:开闭原则是抽象类,其他五个设计原则是具体实现类,是指导设计的工具和方法。

设计原则之开闭原则详解相关推荐

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

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

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

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

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

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

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

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

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

    1.什么是开闭原则 开闭原则的英文是Open Closed Principle,缩写就是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)是指一个软件 ...

最新文章

  1. 编程求文件file1中数据的平均值,并将其与平均值最接近的数删除
  2. 如何自动保存 Spring Boot 应用进程号?
  3. 发明喂饭机器人_人类又懒出新高度,老美发明自动喂饭机器人,“君子”动嘴不动手...
  4. HLSL-高级着色语言简介【转】
  5. 【ES】es 冻结的索引如何查询
  6. Python之路--协程/IO多路复用
  7. 如何进行多语言发布,做国际化开发
  8. hihocoder-Week195-奖券兑换
  9. nero10 序列号
  10. z11 max android 6.0,努比亚Z11Max 安卓6.0 魅族Flyme6刷机包 最新6.7.12.29R紫火版 20180108更新...
  11. Java初学者作业——定义客户类(Customer),客户类的属性包括:姓名、年龄、电话、余额、账号和密码;方法包括:付款。
  12. python爬取app store的评论_用python爬取苹果官网店铺
  13. 叶史瓦大学计算机科学,本地知名新西兰留学咨询平台排名
  14. 我的四轴飞行器经验总结(一)
  15. excel想要把两列合并且用空格隔开
  16. Linux版csgo调全屏窗口,csgo全屏和全屏窗口 哔哩哔哩直播姬黑屏解决方法
  17. B. Combinatorics Homework(抽屉原理)
  18. LightMap烘焙技巧
  19. ROS话题可视化工具PlotJuggler
  20. android管理工具,AnyDroid(电脑安卓手机管理工具)V7.3.0.20200910 正式版

热门文章

  1. 空窗期要抓紧了.....
  2. 元宇宙大投资-2、抓紧元宇宙本质
  3. 基于python 3 的selenium模块实现网页自动登陆
  4. quantile() 函数
  5. 2018年 前端秋季校招面经
  6. 怎么看守望先锋服务器位置,守望先锋手机怎么查战绩_守望先锋国服战绩在哪看_玩游戏网...
  7. java getenv()_Java系统变量信息获取方法System.getenv()与System.getProperty()
  8. 微信公众号H5开发登录授权流程
  9. 超级产品:焦点分析!奶茶加盟有多坑?90%的店铺开完就倒闭
  10. 【C/C++服务器开发】中间件的含义及常用中间件介绍