架构设计方法总结

函数式接口 + 模板方法

函数式接口 + 模板方法的组合,将继承关系转变为组合关系:

固定流程由模板方法(execute 或 run)统一封装;

可变行为通过函数式接口参数传入,无需新建子类;

以xxljob任务实现为例。

  • 函数式接口
java 复制代码
@FunctionalInterface
public interface JobExecutor {
    /**
     * 执行任务核心逻辑
     */
    ReturnT<String> execute(String param) throws Exception;
}
  • 模板方法
java 复制代码
// 固定流程,非核心逻辑
@Slf4j
@Component
public class JobExecuteTemplate {
    
    /**
     * 模板方法:固定执行流程,业务逻辑通过函数式接口参数注入
     */
    public static ReturnT<String> execute(String jobName, JobExecutor executor) {
        long startTime = System.currentTimeMillis();
        String param = null;
        
        try {
            // 1. 统一获取参数
            param = XxlJobHelper.getJobParam();
            log.info("[{}] 任务开始执行,参数: {}", jobName, param);
            
            // 2. 执行业务逻辑(由调用方通过 Lambda 传入)
            ReturnT<String> result = executor.execute(param);
            
            // 3. 处理成功结果
            XxlJobHelper.handleSuccess(result.getMsg());
            log.info("[{}] 任务执行成功,耗时: {}ms", jobName, System.currentTimeMillis() - startTime);
            return result;
            
        } catch (Exception e) {
            // 4. 统一异常处理
            log.error("[{}] 任务执行失败,参数: {}", jobName, param, e);
            XxlJobHelper.handleFail("[{}] 执行失败: " + e.getMessage(), jobName);
            return new ReturnT<>(ReturnT.FAIL_CODE, e.getMessage());
            
        } finally {
            // 5. 统一记录耗时
            log.info("[{}] 任务执行结束,总耗时: {}ms", jobName, System.currentTimeMillis() - startTime);
        }
    }
}
  • 业务使用
java 复制代码
@XxlJob("cleanExpiredOrders")
public ReturnT<String> cleanExpiredOrders(String param) throws Exception {
    // 仅需传入任务名称和核心业务逻辑(Lambda 表达式)
    return JobExecuteTemplate.execute("清理过期订单", param -> {
        // 解析参数(JSON 格式)
        CleanOrderParam cleanParam = JSON.parseObject(param, CleanOrderParam.class);
        int count = orderService.cleanExpiredOrders(cleanParam.getDays());
        return ReturnT.SUCCESS;
    });
}
相关推荐
zzu123zsw1 天前
从 SPI 契约到独立 ClassLoader 隔离:Spring Boot 插件热插拔架构设计与内存泄露防御
java·spring boot·后端·架构设计
要开心吖ZSH2 天前
DDD(领域驱动设计)篇四:退费 + 支付,三层 vs DDD 各撸一遍
领域模型·ddd·领域驱动设计·架构设计·设计思想
诺伦2 天前
AI Agent 营销市场 442 亿:多 Agent 协同如何跑通内容→分发→复盘闭环 | RiseClaw玄策
架构设计·ai agent·多agent协同·agent编排·增长运营
真上帝的左手3 天前
10. 软件设计&架构-架构师之路-1.究竟什么是架构设计?
架构·架构设计
loulanyue_3 天前
10000P国产算力破壁上线,算电协同与超智融合打破算力孤岛:高文院士图灵奖得主纵论世界算力网新纪元——读2026世界算力网大会实录
人工智能·大模型·架构设计·高性能计算·算力网络
武雄(小星Ai)4 天前
智能家居云依赖排坑:从 Nest 温控器被远程“变砖“到 Home Assistant 自托管救赎
物联网·智能家居·架构设计·homeassistant
诺伦4 天前
Manus 2.0 推出个人 Agent 平台 Cue:通用编排与垂类闭环,架构差在哪 | RiseClaw玄策
架构设计·ai agent·manus·agent编排·增长运营agent
zzu123zsw7 天前
把条件校验收敛到枚举接口:Spring Boot 统一断言模式与零污染异常切面工程化
java·spring boot·后端·架构设计
坤盾科技8 天前
DeepSeek 开源模型矩阵深度拆解:不追“全能“,用架构差异重新定义能力边界
架构设计·moe·开源模型·deepseek·推理模型·engram
只睡四小时10 天前
Local-First 数据契约:一张表装下 4 类数据
前端·javascript·架构设计·local-first·数据契约