设计模式选型:解析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
相关产品推荐
相关产品推荐

