当前位置:网站首页>软件设计七大原则之开闭原则(Open-Closed Principle, OCP)
软件设计七大原则之开闭原则(Open-Closed Principle, OCP)
2022-08-05 11:46:00 【夏至青柠】
活动地址:CSDN21天学习挑战赛
开闭原则
开闭原则(Open-Closed Principle, OCP)是指一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节。可以提高软件系统的可复用性及可维护性。开闭原则,是面向对象设计中最基础的设计原则。它指导我们如何建立稳定灵活的系统。
例如:我们版本更新,我尽可能不修改源代码,但是可以增加新功能。
在现实生活中对于开闭原则也有体现。比如,很多互联网公司都实行弹性制作息时间,规定每天工作 8 小时。意思就是说,对于每天工作 8 小时这个规定是关闭的,但是你什么时候来,什么时候走是开放的。早来早走,晚来晚走。
实现开闭原则的核心思想就是面向抽象编程,接下来我们来看一段代码:以售卖课程为例,首先创建一个课程接口 ICourse
public interface ICourse {
Integer getId();
String getName();
Double getPrice();
}
整个课程生态有 Java 架构、大数据、人工智能、前端、软件测试等,我们来创建一个 Java 架构课程的类 JavaCourse:
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 this.id;
}
public String getName() {
return this.name;
}
public Double getPrice() {
return this.price;
}
}
public class OpenCloseTest {
public static void main(String[] args) {
ICourse iCourse = new JavaCourse(1,"Java架构",11800D);
System.out.println("课程ID:" + iCourse .getId() +
"\n课程名称《" + iCourse .getName() + "》" +
"\n售价:" + iCourse .getPrice() );
}
}
现在我们要给 Java 架构课程做活动,价格优惠。如果修改 JavaCourse 中的 getPrice()方法,则会存在一定的风险,可能影响其他地方的调用结果。我们如何在不修改原有代码前提前下,实现价格优惠这个功能呢?现在,我们再写一个处理优惠逻辑的类,JavaDiscountCourse 类 ( 思 考 一 下 为 什 么 要 叫 JavaDiscountCourse , 而 不 叫DiscountCourse):
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;
}
}
public class OpenCloseTest {
public static void main(String[] args) {
ICourse iCourse = new JavaDiscountCourse(1,"Java架构",11800D);
JavaDiscountCourse discountCourse = (JavaDiscountCourse)iCourse;
System.out.println("课程ID:" + discountCourse.getId() +
"\n课程名称《" + discountCourse.getName() + "》" +
"\n原价:" + discountCourse.getPrice() +
"\n售价:" + discountCourse.getDiscountPrice());
}
}
边栏推荐
猜你喜欢
No developers, received a job to develop an IoT system, do you want to do it?
莅临GOPS大会龙智展位,获取Forrester最新报告:《Forrester Wave:2021年第四季度企业服务管理报告》
高泽龙出席博鳌全球旅游生态大会 讲元宇宙与未来网络科技
对于聚合物聚乙二醇PEG大家了解多少了?以及在生活中的应用
互联网行业凛冬之至,BATM的程序员是如何应对中年危机的?
knife4j
The principle and application scenario of mysql master-slave synchronization
The importance of parameter naming, remember a JDBC parameter conflict
Support Vector Machine SVM
内存问题难定位,那是因为你没用ASAN
随机推荐
hdu 1870 愚人节的礼物 (栈)
【着色器实现Flicker“DJ”闪烁效果_Shader效果第十五篇】
Gray value and thermal imaging understanding
解决 cuDNN launch failure 错误
Cesium.js 地形挖洞
Byte Qiu Zhao confused me on both sides, and asked me under what circumstances would the SYN message be discarded?
丹尼尔·拉瑞莫(BM):EOS的主要开发者
一张图理解EOS是什么
Cesium.js点线面绘制
Keras 分割网络自定义评估函数 - mean iou
Machine Learning - Logistic Regression
EOS的共识机制与区块生成
swig 语法介绍
#yyds干货盘点#JS数组和树相互转化
Mysql8基础知识
碘乙酰胺在Desthiobiotin-Iodoacetamide试剂中的作用?
SonarQube即将亮相第十八届GOPS全球运维大会
Gao Zelong attended the Boao Global Tourism Ecology Conference to talk about Metaverse and Future Network Technology
Can't get in to ask questions.I want to ask you a question about the return value (traversal of the graph), please give Xiaobai an answer.
Zhihu asks: Can China still achieve great national rejuvenation?