信息发布→ 登录 注册 退出

Java设计模式七大原则之开闭原则详解

发布时间:2026-01-11

点击量:
目录
  • 定义
  • 案例
    • 需求
    • 方案一
    • 执行结果
    • 方案二
    • 执行结果
  • 对比分析
    • 总结

      定义

      开闭原则( Open Close Principle ),又称为OCP原则,即一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。其中,对扩展开放是针对提供方来说的,对修改关闭是针对调用方来说的。

      案例

      需求

      购买东西的时候,根据支付类型的不同使用不同的方式进行支付,当类型为1时,使用微信支付;当类型为2时,使用支付宝支付

      方案一

      定义支付类型

      /**
       * 支付类型
       * @author:liyajie
       * @createTime:2025/2/7 10:21
       * @version:1.0
       */
      public class PayType {
          int type;
      }

      定义微信支付类

      /**
       * 微信支付类
       * @author:liyajie
       * @createTime:2025/2/7 10:46
       * @version:1.0
       */
      public class WxPay extends PayType{
          WxPay(){
              super.type = 1;
          }
      }

      定义支付宝支付类

      /**
       * 支付宝支付类
       * @author:liyajie
       * @createTime:2025/2/7 10:46
       * @version:1.0
       */
      public class ZfbPay extends PayType{
          ZfbPay(){
              super.type = 2;
          }
      }

      定义支付操作类

      /**
       * @desc:
       * @author:liyajie
       * @createTime:2025/2/7 10:41
       * @version:1.0
       */
      public class Pay {
          public void pay(PayType s) {
              if (s.type == 1) {
                  wxPay(s);
              } else if (s.type == 2) {
                  zfbPay(s);
              }
          }
      
          // 微信支付
          public void wxPay(PayType r) {
              System.out.println(" 正在微信支付中---支付成功 ");
          }
      
          // 支付宝支付
          public void zfbPay(PayType r) {
              System.out.println(" 正在支付宝支付中---支付成功");
          }
      
      }

      定义测试类

      /**
       * 测试类1
       * @author:liyajie
       * @createTime:2025/2/7 10:48
       * @version:1.0
       */
      public class Test1 {
          public static void main(String[] args) {
              new Pay().pay(new WxPay());
              new Pay().pay(new ZfbPay());
          }
      }

      执行结果

      方案二

      定义支付类型基类

      /**
       * 支付类型基类
       * @author:liyajie
       * @createTime:2025/2/7 10:21
       * @version:1.0
       */
      public abstract class PayTypeNew {
      
          int type;
      
          public abstract void pay();
      }

      定义微信支付类

      /**
       * 微信支付类
       * @author:liyajie
       * @createTime:2025/2/7 10:46
       * @version:1.0
       */
      public class WxPayNew extends PayTypeNew{
          WxPayNew(){
              super.type = 1;
          }
      
          @Override
          public void pay() {
              System.out.println(" 正在微信支付中---支付成功 ");
          }
      }

      定义支付宝支付类

      /**
       * 支付宝支付类
       * @author:liyajie
       * @createTime:2025/2/7 10:46
       * @version:1.0
       */
      public class ZfbPayNew extends PayTypeNew{
          ZfbPayNew(){
              super.type = 2;
          }
      
          @Override
          public void pay() {
              System.out.println(" 正在支付宝支付中---支付成功");
          }
      }

      定义支付操作类

      /**
       * 支付操作类
       * @author:liyajie
       * @createTime:2025/2/7 10:41
       * @version:1.0
       */
      public class PayNew {
          public void pay(PayTypeNew payTypeNew) {
              payTypeNew.pay();
          }
      }

      定义测试类

      /**
       * 测试类2
       * @author:liyajie
       * @createTime:2025/2/7 10:48
       * @version:1.0
       */
      public class Test2 {
          public static void main(String[] args) {
             new PayNew().pay(new WxPayNew());
             new PayNew().pay(new ZfbPayNew());
          }
      }

      执行结果

      对比分析

      方案一,未遵守开闭原则,耦合较高,如果需求需要扩展,比如再增加一个信用卡支付,那么需要改的地方较大,风险较高

      方案二,遵守开闭原则,耦合低,扩展方便,并且也提高了代码的复用性,维护起来也很方便

      总结

      开闭原则是最基础最重要的设计原则,开闭原则可以提高复用性和可维护性

      在线客服
      服务热线

      服务热线

      4008888355

      微信咨询
      二维码
      返回顶部
      ×二维码

      截屏,微信识别二维码

      打开微信

      微信号已复制,请打开微信添加咨询详情!