设计原则之开闭原则详解
一、开闭原则定义:
一个软件实体如类、模块、函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现实现细节。
- 也就是说我们如果想实现某种变化,不应该修改原类或模块实现相应的功能细节,而是对原类或模块实体进行扩张 继承来具体实现某一变化。
- 一个软件实体在使用过程中许多模块都会不断发生变化,以修改某商品价格为例,如果频繁修改原功能模块,则需要频繁打包上架重启,开闭原则可以提高软件系统的可复用性、灵活性和可维护性。
下面我们用一个例子来理解开闭原则:
先写一个课程接口,定义公共使用的方法
/*** 定义个课程接口,定义公共行为方法* 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 类,我们没有修改底层模块,代码改变量少,可以有效的防止风险的扩散。
- 如果要修改代码中某些逻辑实现细节的变化,尽量避开低层代码的逻辑,如果要修改低层代码,你要确定都有哪些高层次的代码使用了这些低层次代码,做统一的修改,低层次的代码的修改,肯定会引起高层次引用代码的变化,牵一发而动全身。所以尽量使用开闭原则,对原低层次代码进行扩展实现。
- 开闭原则是最基础的设计原则,其他五个原则都是以开闭原则为基础,你也可以这么理解:开闭原则是抽象类,其他五个设计原则是具体实现类,是指导设计的工具和方法。
设计原则之开闭原则详解相关推荐
- 设计模式-软件架构设计七大原则及开闭原则详解
前言 在日常工作中,我们使用Java语言进行业务开发的时候,或多或少的都会涉及到设计模式,而运用好设计模式对于我而言,又是一个比较大的难题.为了解决.克服这个难题,Remi酱特别开了这个博客来记录自己 ...
- 设计模式-02.经典设计原则-第一节-单一职责原则,开闭原则,里式替换,接口隔离【万字长文系列】
文章目录 设计模式经典设计原则-第一节 单一职责原则(SRP) 如何理解单一职责原则? 如何判断类的职责是否足够单一? 类的职责是否设计得越单一越好? 开闭原则(OCP) 如何理解"对扩展开 ...
- Java设计原则之单一职责原则、开闭原则、里氏代换原则
文章目录 面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 面向对象设计原则概述 软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量 ...
- 七大设计原则之开闭原则
一.开闭原则介绍 开闭原则(Open Closed Principle)是编程中最基础,也是最重要的设计原则.编程中遵循其他原则以及使用设计模式的目的就是遵循开闭原则. 一个软件实体如类,模块和函数应 ...
- 设计原则:开闭原则(OCP)
1.什么是开闭原则 开闭原则的英文是Open Closed Principle,缩写就是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)是指一个软件 ...
最新文章
- 编程求文件file1中数据的平均值,并将其与平均值最接近的数删除
- 如何自动保存 Spring Boot 应用进程号?
- 发明喂饭机器人_人类又懒出新高度,老美发明自动喂饭机器人,“君子”动嘴不动手...
- HLSL-高级着色语言简介【转】
- 【ES】es 冻结的索引如何查询
- Python之路--协程/IO多路复用
- 如何进行多语言发布,做国际化开发
- hihocoder-Week195-奖券兑换
- nero10 序列号
- z11 max android 6.0,努比亚Z11Max 安卓6.0 魅族Flyme6刷机包 最新6.7.12.29R紫火版 20180108更新...
- Java初学者作业——定义客户类(Customer),客户类的属性包括:姓名、年龄、电话、余额、账号和密码;方法包括:付款。
- python爬取app store的评论_用python爬取苹果官网店铺
- 叶史瓦大学计算机科学,本地知名新西兰留学咨询平台排名
- 我的四轴飞行器经验总结(一)
- excel想要把两列合并且用空格隔开
- Linux版csgo调全屏窗口,csgo全屏和全屏窗口 哔哩哔哩直播姬黑屏解决方法
- B. Combinatorics Homework(抽屉原理)
- LightMap烘焙技巧
- ROS话题可视化工具PlotJuggler
- android管理工具,AnyDroid(电脑安卓手机管理工具)V7.3.0.20200910 正式版
热门文章
- 空窗期要抓紧了.....
- 元宇宙大投资-2、抓紧元宇宙本质
- 基于python 3 的selenium模块实现网页自动登陆
- quantile() 函数
- 2018年 前端秋季校招面经
- 怎么看守望先锋服务器位置,守望先锋手机怎么查战绩_守望先锋国服战绩在哪看_玩游戏网...
- java getenv()_Java系统变量信息获取方法System.getenv()与System.getProperty()
- 微信公众号H5开发登录授权流程
- 超级产品:焦点分析!奶茶加盟有多坑?90%的店铺开完就倒闭
- 【C/C++服务器开发】中间件的含义及常用中间件介绍