函数式接口不是设计模式的替代品,而是让策略、观察者、模板方法、工厂/建造者等模式更轻量自然:策略用function等替代策略类;观察者用consumer统一回调;模板方法将钩子变为参数;工厂用supplier/function封装构造逻辑。

函数式接口在设计模式中不是替代模式,而是让某些模式变得更轻量、更自然。它不改变模式本质,但能简化实现、减少模板代码、提升可读性与组合能力。
策略模式:用函数式接口替代具体策略类
传统策略模式需要定义策略接口 + 多个实现类,而函数式接口直接把“策略”变成一个可传入的参数。
- 不用写 Strategy 接口和 ConcreteStrategyA/B/C 类,直接用 Function、Predicate、Consumer 等内置接口或自定义函数式接口
- 调用方按需传 Lambda 或方法引用,策略即刻生效,无需提前注册或构造
- 例如:订单折扣逻辑可抽象为 Function
,不同活动传不同实现: x -> x.getAmount().multiply(DECIMAL_09)(九折)或Order::getVipDiscount(VIP专属)
观察者/回调模式:用函数式接口统一事件处理器
监听行为天然符合“单动作”语义,函数式接口比定义完整监听器接口更简洁。
- 避免冗长的 Observer 接口(如 update(Event e)、onError(Throwable t)、onComplete()),只保留核心动作
- 常用场景:异步任务完成通知、数据变更回调、UI点击响应
- 示例:
public void fetchData(Consumer<result> onSuccess, Consumer<exception> onError)</exception></result>—— 调用方直接传r -> show(r)和e -> log(e),无须新建类
模板方法模式:用函数式接口注入可变步骤
模板方法中固定流程里的“钩子”,正好对应函数式接口的抽象方法,让子类定制点变成参数。
- 原需继承抽象类并重写 hookMethod(),现可改为方法参数,如 BiFunction
用于自定义格式化逻辑 - 流程主干保持不变,变化点完全外部化,测试更易 Mock,扩展零侵入
- 例如:日志记录模板中,时间戳格式、敏感字段脱敏规则均可作为 Function
注入
工厂/建造者模式:用函数式接口封装对象构造逻辑
当对象创建过程含条件分支或行为定制时,函数式接口可替代复杂 if-else 或多个 Builder 方法。
- Supplier
可延迟创建对象;Function 可基于输入构建差异化实例 - 结合 default 方法还能提供链式配置,比如自定义 HTTP 客户端 builder 中,
addInterceptor(Consumer<request>)</request>比 addHeader/addTimeout/addRetry 更灵活 - 阿里云 SDK 初始化也常配合 Function 做 client 配置后处理,如
clientBuilder -> clientBuilder.setEndpoint(...).setCredentials(...)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











