定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
强调的是用抽象构建框架,用实现扩展细节。
优点:提高软件系统的可复用性及可维护性
例如:
创建一个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,那这个影响就非常大,有可能我们为了改一个模块影响到另一个模块,所以说我们在面向对象编程的时候,一定强调开闭原则,其他原则也都是开闭原则的具体形态,提高了复用性和可维护性,因为我们在公司并不是一个人开发,我们要考虑软件的维护成本。