开闭原则是什么?

开闭原则(Open/Closed Principle)是指对于扩展,类应该是“开放”的;对于修改,类则应该是“封闭”的。这个原则的主要理念是在实现新功能时对已有的代码保持不变。
如果你可以对一个类进行扩展(extend),创建它的子类并在子类做任何事情(如添加新的方法或字段、重写基类的方法等),那么这个类就是“开放”的。在 Java 中,我们可以通过 final 关键字来限制类的扩展,那么这样的类就不再是“开放”的。如果某个类已经完成,能够供其他类使用的话,那么这个类就是“封闭”的。
如果一个类已经完成开发、测试和审核工作,并且属于某个框架或者可被其他类的代码直接使用的话,对其代码进行修改就会存在一定的风险。我们可以创建一个子类并重写原始类的部分内容以完成不同的行为,而不是直接对原始类的代码进行修改。
当然,这个原则并不是说我们不能对所有的类进行修改。如果我们发现一个类的代码存在缺陷,直接对其进行修复即可。

案例

还是用一个简单的案例来帮助我们理解开闭原则。假设现在有一个图书管理系统,我们定义了一个 Book 类来表示书,一本书有名字、作者、内容等属性。

  1. public class Book {
  2. private String name;
  3. private String author;
  4. private String text;
  5. // constructor, getters and setters
  6. }

这个类在我们的程序中运行得很好,但考虑到现在越来越多的习惯阅读电子书,我们的图书管理系统需要进行升级以满足对电子书的管理。一般的电子书有 txt、pdf、epub 等格式,所以我们要用一个属性来表示电子书的格式。由于原来的 Book 类已经在我们的程序中完美运行,遵循开闭原则,我们不打算直接在 Book 类中添加一个 format 属性,而是扩展 Book 类来达到我们的目标:

  1. public class EBook extends Book {
  2. private String format;
  3. // constructor, getters and setters
  4. }

这样,扩展 Book 类就不会影响原来已有代码的正常运行。

案例源码

可在 GitHub 上查看上述案例的完整代码。

参考资料

以下是本文参考的资料: