JAVA中面向对象与设计模式的开发经验总结

引言

在JAVA开发中,面向对象(OOP)与设计模式的结合是构建高扩展性、可维护性系统的关键。本文将通过一个典型的服务管理类图(涉及Bean注入、工厂模式、抽象复用等核心设计),总结如何通过设计模式实现代码解耦、逻辑复用,并提升系统的灵活性。


一、核心设计原则的应用

类图中体现的以下原则值得重点关注:

  1. 单一职责原则(SRP)

    • 服务实现分层:如“共享查询树过滤方法”与“退回实现”分离,确保每个类仅负责一个功能域。
    • 接口隔离:通过“共享接口”定义通用行为(如查询、退回),具体实现由子类完成。
  2. 开闭原则(OCP)

    • 新增“原始默认查询”或扩展“退回实现”时,无需修改已有代码,仅需扩展接口或抽象类。
  3. 依赖倒置原则(DIP)

    • 通过“Service工厂”创建实例,高层模块(如调用方)依赖抽象接口,而非具体实现类。

二、设计模式的实践

1. 工厂模式:解耦对象创建

  • 场景:通过“Service工厂”统一管理服务实例的创建(如A类业务逻辑通用业务逻辑)。
  • 优势
    • 隐藏对象创建细节,调用方仅需关注接口。
    • 支持动态切换实现类(例如根据配置选择不同的查询策略)。

2. 模板方法模式:复用公共逻辑

  • 场景:“树过滤方法抽象”与“退回公用方法抽象”通过抽象类定义算法骨架,具体步骤由子类实现。

  • 示例

    public abstract class FilterAbstract implaments FillingService {
        protected void filterByStatus(List<FillingInfoDTO> targetList);
        protected void filterByName(List<FillingInfoDTO> targetList);
        private void xxx();
    }
    

3. 策略模式:灵活扩展算法

  • 场景:不同查询逻辑(如“原始默认查询”与“过滤查询”)实现同一接口,运行时动态选择。

  • 实现

    public interface QueryStrategy {
        List<Result> execute();
    }
    public class DefaultQuery implements QueryStrategy { /* ... */ }
    public class FilteredQuery implements QueryStrategy { /* ... */ }
    

三、代码复用与抽象设计

  1. 接口抽象
    • 定义“共享接口”规范服务行为(如fillingBack()query()),确保实现类的一致性。
  2. 抽象类封装通用逻辑
    • 将重复代码(如此处提到的树过滤公共方法、子类通用方法、通用退回逻辑等)提取到抽象类中,子类仅需实现差异化逻辑。

四、服务注册与调用流程

类图中“前置注册,后置调用串联”体现了流程控制的设计思想:

  1. 前置注册

    • 通过Spring的InitializingBean@PostConstruct注解初始化方法,将服务实例注册到工厂中。

      @Override
      public void afterPropertiesSet() {
          ShareFillingFactory.registerFillingService("DEFAULT", this);
      }
      
      private static final Map<String, FillingService> fillingServiceMap = new ConcurrentHashMap<>();
      
      public static void registerFillingService(String type, RptShareFillingService service) {
          fillingServiceMap.put(type, service);
      }
      
  2. 后置调用

    • 使用工厂方法提供的getService()获取对应的具体的Service实现,并直接调用对应的方法。

      String sheetCode = queryDTO.getSheetCode();
      // 根据 sheetCode 对应业务场景获取对应的处理逻辑Service
      FillingService fillingService = Optional.ofNullable(FillingFactory.getFillingService(sheetCode))
              .orElse(FillingFactory.defaultService());
      return fillingService.fillingTree(queryDTO);
      

五、案例分析与总结

image-20250423152527334.png

退回服务查询服务为例:

  • 实现标准化:通过接口定义fillingBack()query()方法,不同业务场景(如订单退回、库存查询)只需实现具体逻辑。
  • 扩展性:新增服务时,仅需实现接口并注册到工厂,无需改动已有代码。
  • 维护性:通过抽象类复用公共逻辑(如参数校验),减少代码冗余。

结语

面向对象与设计模式的结合,能够将复杂系统分解为高内聚、低耦合的模块。本文案例中的工厂模式、模板方法等实践,不仅提升了代码的可读性和可维护性,还为未来需求变更预留了扩展空间。在实际开发中,需根据业务场景灵活选择模式,避免过度设计,实现技术与业务的平衡。