开闭原则(Open-Closed Principle,OCP)是指一个软件实体(如类、模块、和函数)应该对扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。它强调的是用抽象构建框架,用实现扩展细节,可以提高软件系统的可复用性及可维护性。开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定、灵活的系统。
实现开闭原则的核心思想就是面向抽象编程,接下来我们来看一段代码:
首先创建一个课程接口 ICourse:
public interface ICourse {Integer getId();String getName();Double getPrice();}
整个课程生态有 Java 架构、大数据、人工智能、前端、软件测试等,我们来创建一个 Java 架构课程的类 JavaCourse:
public class JavaCourse implements ICourse {Integer id;String name;Double price;public JavaCourse(Integer id, String name, Double price) {this.id = id;this.name = name;this.price = price;}@Overridepublic Integer getId() {return this.id;}@Overridepublic String getName() {return this.name;}@Overridepublic Double getPrice() {return this.price;}}
现在我们要给 Java 架构课程做活动,价格优惠。如果修改 JavaCourse 中的 getPrice() 方法,则会存在一定的风险,可能影响其他地方的调用结果。
我们如何在不修改原有代码前提前下,实现价格优惠这个功能呢?
现在,我们再写一个处理优惠逻辑的类,JavaDiscountCourse 类(思考一下为什么要叫 JavaDiscountCourse,而不叫 DiscountCourse):
public class JavaDiscountCourse extends JavaCourse {public JavaDiscountCourse(Integer id, String name, Double price) {super(id, name, price);}public Double getOriginPrice() {return super.getPrice();}public Double getPrice() {return super.getPrice() * 0.61;}}
回顾一下,简单看一下类结构图,如下图所示。

摘录:《Spring 5 核心原理与30个类手写实战》来自文艺界的Tom老师的书籍。
作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/ezzvsc 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
