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() 实现,代码更优雅。

总结

  • 新建类是为了遵循开闭原则,让代码更灵活、可扩展、易维护,减少对原有代码的影响。
  • 如果直接加方法,短期看简单,长期看会让类越来越臃肿,违背面向对象设计原则。
posted @ 2025-06-15 16:58  予真  阅读(8)  评论(0)    收藏  举报