You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设计模式选型:解析4种不同JSON配置文件的方法复用方案咨询

推荐方案:模板方法模式(Template Method Pattern)

这是最匹配你当前需求的设计模式,适配原因和实现逻辑如下:

匹配逻辑

你的配置加载场景存在明确的固定主流程+可变扩展步骤的特征:

  • 固定主流程:所有配置类都必须先执行getConfigs()拉取基础JSON配置
  • 可变扩展步骤:部分配置类需要执行额外的API调用,不需要扩展的配置类可以跳过该步骤
    模板方法模式刚好可以把固定流程封装到抽象父类,可变步骤做成钩子方法留给子类按需实现,同时完全满足你扩展逻辑复用、不泄露到客户端的要求。

具体实现示例(以Java为例,其他编程语言逻辑一致)

1. 定义抽象配置基类

把固定加载流程封装成不可重写的入口方法,预留扩展钩子:

public abstract class BaseConfig {
    // 统一加载入口,final修饰避免子类修改主流程
    public final void loadConfig() {
        // 所有配置类都要执行的通用步骤
        getConfigs();
        // 扩展钩子:需要额外逻辑的子类重写即可
        afterGetConfigs();
    }

    // 基础配置拉取方法,各子类自行实现对应JSON读取/拉取逻辑
    protected abstract void getConfigs();

    // 扩展钩子默认空实现,无需额外步骤的子类不用重写
    protected void afterGetConfigs() {}
}

2. 各配置类继承基类实现对应逻辑

  • A、B类仅需实现getConfigs()即可,无需处理扩展逻辑:
public class A extends BaseConfig {
    @Override
    protected void getConfigs() {
        // A类原有getConfigs逻辑
    }
}
// B类实现和A类完全一致,略
  • C类重写扩展钩子,调用自有getCase()方法,getCase()的逻辑可以封装在C类内部,也可以抽成公共工具/策略类供其他场景复用:
public class C extends BaseConfig {
    @Override
    protected void getConfigs() {
        // C类原有getConfigs逻辑
    }

    @Override
    protected void afterGetConfigs() {
        getCase();
    }

    private void getCase() {
        // 可复用的getCase逻辑,也可以抽成独立组件注入调用
    }
}
  • D类实现逻辑和C类类似,重写扩展钩子调用getHeader()即可,略。

3. 客户端调用

客户端完全不需要关心不同配置类的内部差异,统一调用入口方法即可,不会出现漏调扩展方法的问题:

// 批量加载所有配置示例
List<BaseConfig> allConfigs = List.of(new A(), new B(), new C(), new D());
allConfigs.forEach(BaseConfig::loadConfig);

方案优势

  • 流程固化:避免客户端重复编写分支判断逻辑,从架构层面避免漏调用扩展方法的问题
  • 逻辑复用:getCase()、getHeader()的逻辑封装在对应类/公共组件中,不会散落到客户端代码,天然支持多场景复用
  • 易扩展:后续新增其他配置类只需要继承BaseConfig实现对应方法即可,符合开闭原则
    如果后续需要给配置类动态叠加多个扩展步骤,可以搭配装饰器模式使用,当前场景下模板方法已经足够,实现成本最低。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:24:02