如何使用Lambda表达式实现装饰者模式?代码举例讲解

装饰者模式动态地给一个对象添加一些额外的职责。就增加功能来说,装饰者模式比生成子类更为灵活。Lambda 表达式可以很好地实现装饰者模式中的装饰组件。我们来看一个例子:
假设我们有一个咖啡店,各种调料可以动态装饰咖啡,这是一个使用装饰者模式的很好示例。

使用 Lambda 表达式实现装饰者模式:

// 咖啡接口  
interface Beverage {
    double cost(); // 费用
}

// 具体的咖啡实现 
class Espresso implements Beverage {
    @Override
    public double cost() {
        return 1.99; 
    }
}

// 调料接口
interface CondimentDecorator {
    Beverage getBeverage();   
}

// 调料实现   
class MilkDecorator implements CondimentDecorator {
    private Beverage beverage;

    public MilkDecorator(Beverage beverage) {
        this.beverage = beverage;
    }  

    @Override   
    public Beverage getBeverage() {
        return beverage;
    }  

    public double cost() {
        return beverage.cost() + 0.10; 
    }  
} 

// 调料实现
class WhipDecorator implements CondimentDecorator {   
    private Beverage beverage;

    public WhipDecorator(Beverage beverage) {
        this.beverage = beverage;
    }   

    @Override   
    public Beverage getBeverage() {
        return beverage;
    }  

    public double cost() {
        return beverage.cost() + 0.20; 
    }  
}   

// 使用    
Beverage beverage = new Espresso();
beverage = new MilkDecorator(beverage);  
beverage = new WhipDecorator(beverage);
System.out.println(beverage.cost()); // 1.99 + 0.10 + 0.20 = 2.29

这里 Beverage 是咖啡的接口,Espresso 是基本的咖啡实现。MilkDecorator 和 WhipDecorator 是两个调料装饰者,使用 Lambda 表达式实现。我们可以不断地把咖啡包装在调料装饰者中,构建出各种组合。