装饰器模式是一种结构型设计模式,它允许你在不改变对象接口的前提下动态地添加功能。这是通过创建一个包装器类,包装原始类来实现的。下面是一个Java装饰器模式的示例代码:
// 接口定义组件对象
interface Coffee {
double getCost();
String getDescription();
}
// 具体组件类
class SimpleCoffee implements Coffee {
@Override
public double getCost() {
return 2.0;
}
@Override
public String getDescription() {
return "Simple Coffee";
}
}
// 装饰器抽象类
abstract class CoffeeDecorator implements Coffee {
protected final Coffee decoratedCoffee;
public CoffeeDecorator(Coffee coffee) {
this.decoratedCoffee = coffee;
}
@Override
public double getCost() {
return decoratedCoffee.getCost();
}
@Override
public String getDescription() {
return decoratedCoffee.getDescription();
}
}
// 具体装饰器类
class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(Coffee coffee) {
super(coffee);
}
@Override
public double getCost() {
return super.getCost() + 0.5;
}
@Override
public String getDescription() {
return super.getDescription() + ", Milk";
}
}
class SugarDecorator extends CoffeeDecorator {
public SugarDecorator(Coffee coffee) {
super(coffee);
}
@Override
public double getCost() {
return super.getCost() + 0.2;
}
@Override
public String getDescription() {
return super.getDescription() + ", Sugar";
}
}
public class TestDemo {
public static void main(String[] args) {
// 创建基础的咖啡
Coffee coffee = new SimpleCoffee();
System.out.println("Cost: " + coffee.getCost() + ", Description: " + coffee.getDescription());
// 使用装饰器添加牛奶
Coffee milkCoffee = new MilkDecorator(coffee);
System.out.println("Cost: " + milkCoffee.getCost() + ", Description: " + milkCoffee.getDescription());
// 使用装饰器再添加糖
Coffee sugarMilkCoffee = new SugarDecorator(milkCoffee);
System.out.println("Cost: " + sugarMilkCoffee.getCost() + ", Description: " + sugarMilkCoffee.getDescription());
}
}
//运行结果:
Cost: 2.0, Description: Simple Coffee
Cost: 2.5, Description: Simple Coffee, Milk
Cost: 2.7, Description: Simple Coffee, Milk, Sugar
类调用关系如图:
在这个示例中,Coffee 接口定义了组件对象,SimpleCoffee 是具体组件类。CoffeeDecorator 是装饰器的抽象类,而 MilkDecorator 和 SugarDecorator 是具体装饰器类。你可以看到如何使用装饰器来动态地添加牛奶和糖到咖啡中,而不需要修改原始咖啡对象。这就是装饰器模式的应用。