架构设计方法总结

函数式接口 + 模板方法

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

固定流程由模板方法(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;
    });
}
相关推荐
記億揺晃着的那天1 天前
Amazon Ads API 实战:如何高精度关联广告活动(Campaign)与 ASIN 及 ERP 产品主数据
软件工程·amazon·架构设计·系统设计·亚马逊·sp-api·amazon ads api
福兮说2 天前
Gin 项目里的错误处理:让 Controller 不必知道错误是怎么来的
后端·go·gin·架构设计
欢醉3 天前
一次RabbitMQ重启引发的网关雪崩复盘
springcloud·架构设计
刘广睿6 天前
衍生素材链怎么设计?截帧、音频与子素材的关联管理复盘
客户端·短视频·效率工具·架构设计·素材管理
递归尽头是星辰9 天前
软件架构风格:范式、落地形态与选型权衡
微服务架构·架构设计·软件架构风格·系统架构师考试·架构落地
刘广睿12 天前
素材库智能集合怎么设计?把多维筛选存成动态收藏的功能复盘
客户端·架构设计·产品设计·素材管理
Patrick在香港13 天前
模型路由器实测:12 个任务省 77%,旗舰过载时的降级要打出显式标记
python·llm·智能路由器·api·架构设计·成本优化
刘广睿13 天前
多素材对比同步播放怎么设计?对齐播放与差异高亮的功能复盘
音视频·效率工具·架构设计·桌面客户端·素材管理
长脖鹿Johnny13 天前
游戏输入系统框架设计(三):网络输入权威与可验证性
网络·游戏·游戏开发·架构设计·输入系统·网络同步
記億揺晃着的那天16 天前
Amazon SP-API 报告创建全流程与状态机:从创建、轮询到下载入库,新手避坑指南
api·架构设计·系统设计·amazon api·sp-api