开闭原则是设计模式六大原则中最重要也是最“虚”的一个原则。为什么说它最重要呢?因为前面五大原则的目的都是为了实现这个开闭原则,开闭原则相当于它们的主旨思想。为什么说它“虚”呢?因为开闭原则只是个指导思想,不像另外五大原则都有具体可行的指导方法。
1、什么是开闭原则
Software entities like classes, modules and functions shoule be open for extension but closed for modifications.(一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。)
开闭原则的定义很短,就是对扩展开放,对修改关闭。但是为什么要遵守这一个原则呢?
做过实际项目的筒子们应该都会深有体会,一个软件在其生命周期内都会发生很多变化,这几乎是不可避免的。无论是需求的变化、业务逻辑的变化、程序代码的变化等等,这些变化都有可能对整个软件的稳定性造成一定的威胁。
而开闭原则就是应对这些变化的,它告诉我们应该通过扩展来实现变化,而不是通过修改已有的代码。
2、例子
UML类图:
程序代码如下:
- 学生类,每个学生都有姓名和成绩:
|
|
- 老师类,每个老师管理一群的学生:
|
|
- 场景类:
|
|
运行结果如下:
|
|
更改需求
把同学们的成绩按照级别来分,分别有优秀,良好,一般,及格,不及格这几种。
直接修改Student类的getGrade方法不就行了嘛? 可能有很多人在实际项目中都是这么做的,但是这就违背了开闭原则,开闭原则要求我们尽量不要修改已有的代码,尽量通过扩展来实现改变。
可以通过扩展已有的代码来实现改变,可以增加一个LevelStudent来继承Student,并扩展修改getGrade方法。
修改后的UML类图如下所示:
增加LevelStudent类代码:
|
|
3、总结
开闭原则是对扩展开放,对修改关闭。
开闭原则的主旨是为了拥抱变化。
在六大原则中,开闭原则只是一个思想,没有具体实际操作方法。其他五大原则都是为了实现这个开闭思想的一些方法和工具。
想要遵守开闭原则,就需要一个设计合理的系统。可以说在做系统设计的时候就要考虑到未来的扩展和改变。