装饰器模式是一种结构型设计模式,允许动态添加对象功能,无需修改原始类。它通过抽象组件、具体组件、抽象装饰器和具体装饰器的协作实现,可以灵活扩展类功能,满足变化的需求。示例中,将牛奶和摩卡装饰器添加到espresso,总价为2.29美元,展示了装饰器模式在动态修改对象行为方面的强大功能。

Java 设计模式之装饰器模式剖析
引言
装饰器模式是一种结构型设计模式,它允许动态地将功能添加到对象上,而无需修改其基础类。通过使用装饰器对象,可以灵活地扩展类功能,满足不断变化的需求。
立即学习“Java免费学习笔记(深入)”;
原理
装饰器模式通过以下方式工作:
- 定义一个抽象组件类,它声明需要装饰的对象的公共接口。
- 实现一个具体组件类,它实现抽象组件类的接口。
- 定义一个抽象装饰器类,它定义了可以附加到具体组件上的附加功能的接口。
- 实现具体装饰器类,它扩展了抽象装饰器类并实现特定功能。
- 使用装饰器模式通过将具体装饰器包裹在具体组件周围来增强组件功能。
代码示例
// 抽象组件
interface Beverage {
double cost();
}
// 具体组件
class Espresso implements Beverage {
@Override
public double cost() {
return 1.99;
}
}
// 抽象装饰器
abstract class CondimentDecorator implements Beverage {
protected Beverage beverage;
public CondimentDecorator(Beverage beverage) {
this.beverage = beverage;
}
}
// 具体装饰器
class Milk extends CondimentDecorator {
public Milk(Beverage beverage) {
super(beverage);
}
@Override
public double cost() {
return beverage.cost() + 0.10;
}
}
// 具体装饰器
class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) {
super(beverage);
}
@Override
public double cost() {
return beverage.cost() + 0.20;
}
}
// 实战案例
public class CoffeeShop {
public static void main(String[] args) {
Beverage espresso = new Espresso();
// 添加牛奶和摩卡装饰器
Beverage milkEspresso = new Milk(espresso);
Beverage mochaMilkEspresso = new Mocha(milkEspresso);
// 计算饮料总价
double totalCost = mochaMilkEspresso.cost();
System.out.println("Beverage cost: " + totalCost);
}
}输出:
Beverage cost: 2.29
结论
装饰器模式可用于在不修改现有代码的情况下动态扩展对象功能。它提供了一种灵活而优雅的方式来满足不断变化的需求,同时保持代码的可维护性和可扩展性。











