用Function和Supplier可解耦模板结构与数据生成,提升灵活性、复用性与可测试性;Function按节点类型动态返回对应模板,统一输入GraphicNode并输出Map或ExportShape,避免if-else链。

在复杂图形编辑器中做序列化时,直接硬编码导出模板容易导致耦合高、扩展难、测试弱。用 Function 和 Supplier 可以把“模板结构”和“模板数据生成”解耦,让导出逻辑更灵活、可复用、易测试。
按需构造模板结构:用 Function 做动态映射
图形编辑器的节点类型多(比如矩形、文本、路径、组合组),每种节点导出格式可能不同。Function
- 定义统一输入:比如传入
GraphicNode实例 - 输出定制结构:返回
Map<string object></string>或专用 DTO,如ExportShape - 避免 if-else 链:用 Map
, Function<...>> 注册策略,查表调用
示例:
Functionif (node instanceof RectNode) return new ExportRect(...);
if (node instanceof TextNode) return new ExportText(...);
throw new UnsupportedNodeTypeException();
};
延迟填充动态字段:用 Supplier 生成实时值
某些导出字段不能预计算——比如时间戳、唯一 ID、当前缩放比例、用户水印文本。这些值应在序列化真正执行时才获取,避免过早固化。
- 把字段封装为
Supplier<string></string>、Supplier<long></long>等 - 模板 DTO 中不存具体值,只存 Supplier 引用
- 最终序列化时统一调用
.get(),确保值新鲜且线程安全(若需)
示例:
class ExportMeta {final Supplier
final Supplier
final Supplier
}
组合使用:构建可配置的模板工厂
把 Function 和 Supplier 组装成模板生成器,支持运行时切换导出行为。
- 用 Function 决定“用哪个模板类”,用 Supplier 决定“这个模板里填什么值”
- 例如:导出为 SVG 模板 vs 导出为 JSON Schema 模板,共用同一组 Supplier 提供元数据
- 测试时可注入 Mock Supplier,轻松验证不同时间/用户/环境下的输出
示例:
SupplierExportTemplate t = new ExportTemplate();
t.setMeta(new ExportMeta()); // 内部全为 Supplier
t.setNodes(nodeList.stream()
.map(shapeMapper)
.collect(Collectors.toList()));
return t;
};
// 序列化入口:
String json = toJson(templateFactory.get()); // 此刻才触发所有 get()
适配主流序列化库
Gson / Jackson 默认不识别 Supplier 字段。需做轻量适配:
- Jackson:加
@JsonSerialize(using = SupplierSerializer.class),序列化时自动调用get() - Gson:注册
TypeAdapterFactory,对 Supplier 类型做透明代理 - 不建议序列化 Supplier 本身,而是序列化它
get()的结果 —— 模板工厂负责这一步

















