装饰器模式(Decorator Pattern)是一种结构设计模式,它允许用户在不修改对象自身的基础上,向一个对象添加新的功能。这种模式通过创建一个包装对象,也就是装饰者,来包裹实际对象。装饰者模式通常用于遵循单一职责原则的场景,允许在运行时动态地给对象添加职责。
- Component 接口:定义了可以动态添加职责的对象接口。
- ConcreteComponent 类:实现了 Component 接口的具体对象。
- Decorator 抽象类:实现了 Component 接口,并持有一个 Component 接口的引用,可以是具体组件或者另一个装饰者。
- ConcreteDecorator 类:继承了 Decorator 抽象类,向 ConcreteComponent 对象添加额外的职责。
假设我们有一个简单的咖啡店,我们想要根据不同的客户需求,动态地给咖啡添加不同的调料。
首先,我们定义咖啡的接口:
java
public interface Coffee {
double cost();
}
然后,我们创建一个具体的咖啡类:
java
public class SimpleCoffee implements Coffee {
@Override
public double cost() {
return 10; // 假设咖啡的基础价格是10元
}
}
接下来,我们创建一个装饰者抽象类:
java
public abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee coffee) {
this.decoratedCoffee = coffee;
}
@Override
public double cost() {
return decoratedCoffee.cost();
}
}
现在,我们可以创建一些具体的装饰者类,来向咖啡添加不同的调料:
java
public class MilkCoffeeDecorator extends CoffeeDecorator {
public MilkCoffeeDecorator(Coffee coffee) {
super(coffee);
}
@Override
public double cost() {
return decoratedCoffee.cost() + 2; // 牛奶咖啡额外加2元
}
}
public class WhipCoffeeDecorator extends CoffeeDecorator {
public WhipCoffeeDecorator(Coffee coffee) {
super(coffee);
}
@Override
public double cost() {
return decoratedCoffee.cost() + 1; // 奶油咖啡额外加1元
}
}
最后,在客户端代码中,我们可以根据需要动态地添加装饰者:
java
public class DecoratorPatternDemo {
public static void main(String[] args) {
Coffee simpleCoffee = new SimpleCoffee();
System.out.println("Cost of Simple Coffee: " + simpleCoffee.cost());
Coffee milkCoffee = new MilkCoffeeDecorator(simpleCoffee);
System.out.println("Cost of Milk Coffee: " + milkCoffee.cost());
Coffee whipCoffee = new WhipCoffeeDecorator(milkCoffee);
System.out.println("Cost of Whip Coffee: " + whipCoffee.cost());
}
}
在这个示例中,Coffee
是 Component 接口,SimpleCoffee
是 ConcreteComponent 类,CoffeeDecorator
是 Decorator 抽象类,而 MilkCoffeeDecorator
和 WhipCoffeeDecorator
是 ConcreteDecorator 类。客户端代码通过装饰者来动态地向咖啡添加不同的调料,而不需要修改咖啡本身的代码。
装饰者模式提供了一种灵活的方式来扩展对象的功能,可以在不修改对象自身的情况下,通过包装对象来增加新的行为。这种模式也支持链式结构,允许多个装饰者依次包装一个对象。