模板方法模式定义一个算法的骨架,将一些步骤的实现延迟到子类。Lambda 表达式可以很好地实现模板方法模式中的某些可变的步骤。我们来看一个例子:
假设我们有一个煮咖啡的算法,其中冲煮咖啡和加调料的步骤是固定的,但是煎豆子的步骤可变。这是一个使用模板方法模式的很好场景。
使用 Lambda 表达式实现模板方法模式:
// 咖啡模板,定义算法骨架
abstract class CoffeeTemplate {
final void makeCoffee() {
grindBeans();
brewCoffee();
addCondiments();
}
void grindBeans() {
System.out.println("把咖啡豆磨成粉");
}
void brewCoffee() {
System.out.println("用热水冲泡咖啡");
}
void addCondiments() {
System.out.println("加奶和糖等调料");
}
// 可变的步骤,使用 Lambda 表达式实现
abstract void grindBeans(int type);
}
// 模板的实现
class CoffeeMaker extends CoffeeTemplate {
@Override
void grindBeans(int type) {
if (type == 1) {
System.out.println("煮意式浓咖啡,细磨咖啡豆");
} else if (type == 2) {
System.out.println("做美式咖啡,粗磨咖啡豆");
}
}
}
// 使用
CoffeeTemplate coffee = new CoffeeMaker();
coffee.makeCoffee();
coffee.grindBeans(1); // 煮意式浓咖啡,细磨咖啡豆
coffee.makeCoffee();
coffee.grindBeans(2);// 做美式咖啡,粗磨咖啡豆
coffee.makeCoffee();
这里 CoffeeTemplate 是咖啡算法的骨架,其中 grindBeans() 方法是可变的,使用 Lambda 表达式实现。CoffeeMaker 继承 CoffeeTemplate 并实现 grindBeans() 方法。
我们可以通过调用 grindBeans() 方法实现不同的磨豆策略,这体现了模板方法模式中的可变步骤。其他的步骤如 brewCoffee() 和 addCondiments() 是算法的固定骨架。
所以,这个示例演示了如何使用 Lambda 表达式很好地实现模板方法模式的可变步骤。相比匿名内部类,Lambda 表达式使代码更加简洁。