通用接口工具类通过“收逻辑、放行为”实现,即固化不变部分为静态方法,将变化部分抽象为策略接口(如HttpRequestStrategy、ResponseHandler、RetryPolicy),配合泛型与函数式参数达成零侵入适配,并利用枚举接口BaseEnum提供类型安全的通用能力,HTTP工具类则通过语义化API和Builder模式屏蔽底层差异。

通用接口工具类不是靠“堆功能”实现的,而是靠“收逻辑、放行为”——把变化的部分抽出来交给调用方决定,把不变的部分固化成静态方法。核心不在“多”,而在“稳”和“可插拔”。
用策略接口代替继承树
别写一个 UniversalHttpTool extends BaseTool implements Loggable, Retryable, Authable 这样的大杂烩类。它会越来越难维护,也违背开闭原则。真正通用的做法是定义清晰的策略接口:
- HttpRequestStrategy:封装 URL 构建、参数组装、Header 注入逻辑
- ResponseHandler<T>:定义如何把原始响应(String/byte[])转成业务对象
- RetryPolicy:控制重试次数、间隔、触发条件
工具类本身只持有一个 static <T> T execute(HttpRequestStrategy req, ResponseHandler<T> handler) 方法,所有变体都通过传入不同策略组合达成。
泛型 + 函数式参数 = 零侵入适配
比如转换 ID 列表为名称字符串的场景,通用方法不关心是用户、部门还是学科,只约定三件事:
- 怎么根据 ID 列表查数据 →
Function<List<String>, List<T>> - 怎么从实体取 ID →
Function<T, String> - 怎么从实体取名称 →
Function<T, String>
调用时直接传方法引用:IdToNameConverter.convert("1,2,3", userMapper::selectByIds, User::getId, User::getName)。实体类无需修改、不继承、不实现任何接口,就能被复用。
枚举与接口协同提供类型安全的通用能力
对状态码、错误类型、操作类型等固定集合,定义统一接口如 BaseEnum<T>,要求所有枚举实现 getCode() 和 getDesc()。再配套提供静态工具方法:
-
BaseEnum.fromCode(Class<E>, String):按编码查枚举,类型安全,空值可控 -
BaseEnum.getAllDescs(Class<E>):一键获取全部描述,用于下拉选项生成 - 配合 Spring 的
@JsonValue和@JsonCreator,天然支持 JSON 序列化/反序列化
这样新增一个枚举,只要实现接口,就自动获得全部通用能力,不用改工具类、不加 if-else。
HTTP 工具类要屏蔽底层差异,暴露语义接口
不要让使用者面对 RestTemplate 或 HttpClient 的配置细节。通用 HTTP 工具应提供语义化方法:
http.get("/api/users").query("page", 1).header("X-Auth", token).as(UserPage.class)http.post("/api/order").json(order).withToken("abc").expect(201).as(OrderResult.class)
背后由 Builder 模式组装请求,策略接口注入认证、序列化、异常映射等逻辑。使用者只关注“我要做什么”,不关心“怎么做到”。

















