如何使用Lambda表达式实现模板方法模式?代码举例讲解

模板方法模式定义一个算法的骨架,将一些步骤的实现延迟到子类。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 表达式使代码更加简洁。