Java 设计模式 开闭原则
以课程体系为例
首先创建一个课程接口ICourse。

整个课程生态有Java架构、大数据、人工智能、前端、软件测试等。我们创建一个Java架构课程的类JavaCourse。

现在要给Java架构课程做活动,价格优惠。如果修改JavaCourse中的getPrice()方法,则会存在一定风险,可能影响其他地方的调用结果。如何在不修改原有代码的前提下,实现价格优惠这个功能呢?我们再写一个处理优惠逻辑的类——JavaDiscountCourse类(可以思考一下为什么要叫JavaDiscountCourse,而不叫DiscountCourse)。

简单回顾一下类图,如下图所示。

从类图中可以看出,JavaDiscountCourse中保留了覆盖JavaCourse的getPrice()方法,而不是直接修改JavaCourse类。
为什么要新建类,而不是在新建一个getDiscountPrice方法
1. 遵循开闭原则(OCP)
- 开闭原则(Open-Closed Principle):
软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
- 解释:
也就是说,当需求变化时,应该通过“扩展”来实现新功能,而不是“修改”原有代码。这样可以减少对已有功能的影响,降低出错风险。
2. 业务变化的灵活性
- 如果你直接在 JavaCourse 里加 getDiscountPrice(),
- 所有课程对象都会有这个方法,即使有些课程永远不会打折。
- 以后如果有更多优惠类型(比如满减、折扣券等),JavaCourse 会越来越臃肿。
- 新建 JavaDiscountCourse,只对有优惠的课程做扩展,更灵活、更清晰。
3. 避免影响原有逻辑
- 直接修改 JavaCourse,可能会影响到所有用到 JavaCourse 的地方,带来不可预知的风险。
- 新建子类,只影响需要优惠的部分,原有代码不变,风险更小。
4. 代码职责单一,易于维护
- JavaCourse 只负责“普通课程”的逻辑。
- JavaDiscountCourse 只负责“有优惠的课程”逻辑。
- 职责清晰,维护简单。
5. 多态的好处
- 通过多态,可以用 ICourse 类型统一管理普通课程和优惠课程,调用时自动走各自的 getPrice() 实现,代码更优雅。
总结
- 新建类是为了遵循开闭原则,让代码更灵活、可扩展、易维护,减少对原有代码的影响。
- 如果直接加方法,短期看简单,长期看会让类越来越臃肿,违背面向对象设计原则。

浙公网安备 33010602011771号