函数式接口通过行为参数化提升设计模式灵活性:策略模式用function/predicate替代策略类,观察者模式用consumer简化回调,模板方法用supplier/function注入钩子,工厂模式用supplier/function构建对象,本质是轻量实现“行为即参数”。

函数式接口在设计模式中的灵活应用,核心是把“变化的行为”抽出来作为参数传递,让原本僵硬的结构变得可插拔、易替换。它不替代经典设计模式,而是让某些模式的实现更轻量、更直观。
策略模式:用 Function/Predicate 替代具体策略类
传统策略模式需要定义策略接口 + 多个实现类,而函数式接口直接用 Lambda 或方法引用传入行为,省去类文件和实例创建开销。
- 比如支付策略:不用写 AlipayStrategy、WechatPayStrategy 类,而是接收 Function
作为支付逻辑 - 校验场景:用 Predicate
替代 UserValidator 接口的多个子类,如 user -> user.getAge() >= 18或User::isEmailVerified - 关键点:策略方法签名统一(如都返回 boolean 或都返回 void),避免混用不同语义的接口
观察者/回调模式:用 Consumer 或 BiConsumer 简化事件通知
监听器不再需要实现接口或继承抽象类,直接传入消费逻辑即可,尤其适合一次性的、轻量级响应。
- 订单创建后发短信、写日志、更新缓存,可分别注册 Consumer
实例,统一由事件总线触发 - 异步结果处理:CompletableFuture.thenAccept(Consumer
) 内部就是靠 Consumer 封装回调,无需额外定义回调接口 - 注意:若需移除监听器或管理生命周期,仍建议封装为对象;纯临时逻辑才推荐直接用 Lambda
模板方法模式:用 Supplier/Function 注入钩子步骤
父类定义流程骨架,把可变环节声明为函数式接口参数,调用方按需注入,比重写抽象方法更灵活。
- 例如导出服务:
export(List<data> data, Function<data string> formatter, Consumer<string> writer)</string></data></data> - formatter 控制每行格式,writer 控制输出目标(文件、网络、内存),主流程不变,行为完全可配
- 相比抽象类中定义 protected abstract String doFormat(Data),这种方式支持运行时动态切换,也便于单元测试打桩
工厂模式:用 Supplier 或 Function 构造对象
当对象创建逻辑简单、无状态、可复用时,Supplier 比工厂类更简洁;带参数构造可用 Function。
- 数据库连接工厂:
Supplier<connection> connFactory = () -> DriverManager.getConnection(url)</connection> - 策略型对象工厂:
Function<string processor> processorFactory = type -> switch(type) { case "json" -> new JsonProcessor(); case "xml" -> new XmlProcessor(); }</string> - 优势:避免单例工厂类的臃肿,配合依赖注入容器(如 Spring)时,Supplier 可自然表达懒加载语义
本质上,函数式接口不是另起炉灶,而是把设计模式里“行为参数化”的思想落地得更直接。它适合行为单一、边界清晰、不需要复杂状态管理的场景。过度使用或强行套用反而会降低可读性——比如一个 Predicate 里塞了 20 行逻辑,就不如拆成独立方法再引用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











