装饰者模式动态地给一个对象添加一些额外的职责。就增加功能来说,装饰者模式比生成子类更为灵活。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 表达式实现。我们可以不断地把咖啡包装在调料装饰者中,构建出各种组合。