装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时动态地给对象添加新的职责或功能。装饰器提供了比继承更灵活的替代方案来扩展类的行为,装饰器和被装饰的对象具有相同的接口,因此可以用来代替原对象。
// 组件接口
public interface Coffee {
double getCost();
String getDescription();
}
// 具体组件:基础咖啡
public class SimpleCoffee implements Coffee {
@Override
public double getCost() {
return 10.0;
}
@Override
public String getDescription() {
return "Simple Coffee";
}
}
// 装饰器抽象类
public abstract class CoffeeDecorator implements Coffee {
protected Coffee coffee;
public CoffeeDecorator(Coffee coffee) {
this.coffee = coffee;
}
@Override
public double getCost() {
return coffee.getCost();
}
@Override
public String getDescription() {
return coffee.getDescription();
}
}
// 具体装饰器:加糖咖啡
public class SugarCoffeeDecorator extends CoffeeDecorator {
private static final double SUGAR_COST = 1.5;
public SugarCoffeeDecorator(Coffee coffee) {
super(coffee);
}
@Override
public double getCost() {
return super.getCost() + SUGAR_COST;
}
@Override
public String getDescription() {
return super.getDescription() + ", with sugar";
}
}
// 使用示例
public class Client {
public static void main(String[] args) {
Coffee simpleCoffee = new SimpleCoffee();
System.out.println(simpleCoffee.getDescription() + ": $" + simpleCoffee.getCost());
Coffee sugarCoffee = new SugarCoffeeDecorator(simpleCoffee);
System.out.println(sugarCoffee.getDescription() + ": $" + sugarCoffee.getCost());
}
}
想象一下你在一个咖啡店点了一杯简单的咖啡,然后又决定加糖。在现实生活中,这就像在原有的咖啡上附加了一个“加糖”的行为。在程序设计中,装饰器模式就是模拟这个过程:先创建一杯基础咖啡,然后用一个“加糖装饰器”去包裹它,使得最终得到的是带有附加功能(即加了糖)的新咖啡对象,但客户并不需要知道装饰过程,只需要按照统一的咖啡接口来操作即可。