函数式接口不替代设计模式,而是简化其实现:策略模式用Predicate/Function替代接口与实现类;观察者模式用Consumer替代Observer接口;工厂与模板方法用Supplier/Function替代抽象类;命令模式用Runnable/Consumer替代Command接口。

函数式接口不是用来“替代”设计模式接口的,而是让很多传统面向对象设计模式的实现变得更轻量、更直接。它不否定模式本身的价值,而是消解了部分模式所需的模板代码和结构开销。
策略模式:用 Function/Predicate 替代策略接口定义
传统策略模式需要先定义一个策略接口(如 DiscountStrategy),再为每种折扣写一个实现类(FixedDiscount、PercentageDiscount)。函数式接口让这个过程变成一行逻辑:
- Predicate<Order> 可直接表达“是否满足满减条件”
- Function<BigDecimal, BigDecimal> 可直接封装“如何计算折扣后价格”
- 无需声明接口、无需实现类,Lambda 或方法引用即策略实例
观察者/回调模式:用 Consumer/Supplier 替代 Observer 接口
过去要定义 Observer 接口 + update() 方法,再实现监听逻辑;现在可直接传 Consumer<Event>:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 注册监听:
eventBus.subscribe("order.created", e -> log.info("New order: {}", e.getId())); - 发布时调用:
handler.accept(event),语义清晰,无抽象层冗余 - 多个监听器可组合:
first.andThen(second),无需自定义事件分发器
工厂与模板方法:用 Supplier/Function 替代抽象工厂类
当创建逻辑简单、参数固定时,Supplier<Service> 比抽象工厂更自然:
立即学习“Java免费学习笔记(深入)”;
- 数据库连接工厂不再需要
DbConnectionFactory类,直接Supplier<Connection> mysqlConn = () -> DriverManager.getConnection(...); - 模板方法中可变步骤可用
Function<Input, Output>注入,避免子类继承和重写 - 运行时动态切换行为(如测试中注入 mock 实现),比编译期继承更灵活
命令模式:用 Runnable/Consumer 替代 Command 接口
命令本质就是“可延迟执行的操作”,而 Runnable 和 Consumer 天然契合:
-
new Thread(() -> doBackup()).start();—— 无需BackupCommand类 -
undoStack.push(() -> document.restoreLastState());—— 命令即闭包,自带上下文捕获 - 撤销/重做链可由
List<Runnable>管理,无需额外封装状态

















