开闭原则是什么?
开闭原则(Open/Closed Principle)是指对于扩展,类应该是“开放”的;对于修改,类则应该是“封闭”的。这个原则的主要理念是在实现新功能时对已有的代码保持不变。
如果你可以对一个类进行扩展(extend),创建它的子类并在子类做任何事情(如添加新的方法或字段、重写基类的方法等),那么这个类就是“开放”的。在 Java 中,我们可以通过 final 关键字来限制类的扩展,那么这样的类就不再是“开放”的。如果某个类已经完成,能够供其他类使用的话,那么这个类就是“封闭”的。
如果一个类已经完成开发、测试和审核工作,并且属于某个框架或者可被其他类的代码直接使用的话,对其代码进行修改就会存在一定的风险。我们可以创建一个子类并重写原始类的部分内容以完成不同的行为,而不是直接对原始类的代码进行修改。
当然,这个原则并不是说我们不能对所有的类进行修改。如果我们发现一个类的代码存在缺陷,直接对其进行修复即可。
案例
还是用一个简单的案例来帮助我们理解开闭原则。假设现在有一个图书管理系统,我们定义了一个 Book 类来表示书,一本书有名字、作者、内容等属性。
public class Book {
private String name;
private String author;
private String text;
// constructor, getters and setters
}
这个类在我们的程序中运行得很好,但考虑到现在越来越多的习惯阅读电子书,我们的图书管理系统需要进行升级以满足对电子书的管理。一般的电子书有 txt、pdf、epub 等格式,所以我们要用一个属性来表示电子书的格式。由于原来的 Book 类已经在我们的程序中完美运行,遵循开闭原则,我们不打算直接在 Book 类中添加一个 format 属性,而是扩展 Book 类来达到我们的目标:
public class EBook extends Book {
private String format;
// constructor, getters and setters
}
这样,扩展 Book 类就不会影响原来已有代码的正常运行。
案例源码
可在 GitHub 上查看上述案例的完整代码。
参考资料
以下是本文参考的资料: