定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
强调的是用抽象构建框架,用实现扩展细节。
优点:提高软件系统的可复用性及可维护性
例如:

创建一个Course接口
获取id方法
获取name方法
获取price方法

创建一个JavaCourse类实现Course接口
设置三个属性
Integer id
String name
Double price
创建一个满参的构造函数
修改重写的三个方法的返回值
创建一个Test测试类
创建一个JavaCourse类,赋予属性
直接输出这个对象的属性
可以在idea编辑器中右键包选择

查看类图关系

比如说现在有一个需求,关于价格有个打8折活动,我们在此基础上在更改接口的话,所有的实现类中的方法都要重写这个方法,如果实现类少的话还可以接受,但是我们的接口是不可以经常变化的,应该是稳定可靠的,否则这个作用也就失去了。
解决方案:我们在写一个JavaDiscountCourse类去继承JavaCourse类,然后去重写父类的getPrice()价格方法,如下图

修改test类 创建的是子类对象(new JavaDiscountCourse)

这样就可以更好的去扩展并且展示出了打折后的价格

但是呢如果需要展示原价格的话又要怎么去做呢?
在子类中定义一个方法getOriginPrice() 去获取原价格

但是我们发现在test中他调用不到定义的获取原价格的方法

虽然定义的是public方法,当时因为我们在test类中使用父类声明的引用,所以他拿不到public方法
所以我们需要将其类型进行强转

这样我们就可以调用定义的获取原价格的方法了

类图如下

总结:开闭原则在这里指的是 对于扩展是开放的,而对修改接口和基类是关闭的
我们变化的都是应用层的子模块,越是底层(基础)的模块进行更改,变化(影响)是越大的,越是高层的模块更改,变化 影响的范围会越小。
简单的理解:比如说我们的Dao层变化了,而这个Dao层被很多service使用,而在上层是controller,那这个影响就非常大,有可能我们为了改一个模块影响到另一个模块,所以说我们在面向对象编程的时候,一定强调开闭原则,其他原则也都是开闭原则的具体形态,提高了复用性和可维护性,因为我们在公司并不是一个人开发,我们要考虑软件的维护成本。
本文探讨了软件设计中的开闭原则,强调通过抽象构建框架,实现细节扩展,以提高软件的可复用性和可维护性。通过课程类的实例,展示了如何在不修改原有接口的情况下,通过继承和多态实现功能扩展。
3204

被折叠的 条评论
为什么被折叠?



