1.1 定义
软件实体应当对于扩展是开放的,而对于修改是关闭的。
软件实体包括:项目所划分的模块,类或接口以及方法。
1.2 作用
开闭原则是面向对象设计的核心,也是面向对象设计的终极目标,它使得软件实体在具有灵活性的同时还保持了稳定性和扩展性,具体作用如下:
<1> 保证程序的稳定性
需求变更时,只需要对相应的功能进行扩展,不需要或者尽可能少的修改现有功能,使程序处于一个相对稳定的状态。
<2> 使代码具有良好的可复用性
粒度越小,被复用的程度就越大;在面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性。
<3> 增强软件的可维护性
采用开闭原则设计的软件,由于自身的稳定性较强,所以对于后期的维护以及扩展自然就容易一些。
<4> 降低测试的工作量
由于只是对原有功能做了增加,所以只需要测试新增的功能即可。
1.3 实现
可以通过“抽象、封装”来实现开闭原则,即通过接口或者抽象类为软件实体定义一个相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。因为抽象灵活、适应性好,所以一个稳定的抽象层基本可以保证软件架构的稳定,而变化频繁的部分由各个实现类具体实现,当需求改变时,新增一个实现类去扩展就可以了。
例如,现有一个程序只有加法操作,我们可以直接创建一个加法类来实现
若是现在需要新增一个减法功能,就会发现需要修改现有的类,那就违背了开闭原则,若新增加一个类处理减法功能,则又会造成代码重复,此时我们就需要对代码进行重构,增加一个抽像的运算类,然后通过继承、多态的方式将具体的功能加法运算、减法运算隔离开,这样程序就会变得非常灵活,既可以满足现有的需求,又可以应对将来的变化,若是再增加乘法和除法运算,则只需要新增实现类对程序进行扩展即可。
需注意:开发人员应该只对程序中呈现出频繁变化的那些部分进行抽象,但不能对程序中的每个部分都刻意地进行抽象,拒绝不合理的抽像和抽象本身一样重要。