装饰器模式(Decorator Pattern)是Java中常用的一种设计模式,属于行为型模式之一。它通过将一个对象放入含有行为的特殊封装对象中来为原对象添加行为。此模式允许向一个现有的对象添加新的功能,同时又不改变其结构。
装饰器模式动态地将责任附加到对象上。若要扩展功能,装饰器提供了比继承更有弹性的替代方案。使用装饰器模式,可以透明地添加责任到对象上,且这些责任可以动态地撤销。
装饰器模式主要包含以下几个角色:
以下是一个简单的Java装饰器模式案例,用于展示如何为一个简单的饮料系统添加不同的装饰(如加糖、加奶)。
public interface Beverage {
String getDescription();
double cost();
}
public class DarkRoast extends Beverage {
@Override
public String getDescription() {
return "Dark Roast Coffee";
}
@Override
public double cost() {
return 2.0;
}
}
public abstract class BeverageDecorator implements Beverage {
protected Beverage beverage;
public BeverageDecorator(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription();
}
@Override
public double cost() {
return beverage.cost();
}
}
public class Milk extends BeverageDecorator {
public Milk(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Milk";
}
@Override
public double cost() {
return beverage.cost() + 0.5;
}
}
public class Sugar extends BeverageDecorator {
public Sugar(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Sugar";
}
@Override
public double cost() {
return beverage.cost() + 0.2;
}
}
public class DecoratorPatternDemo {
public static void main(String[] args) {
Beverage darkRoast = new DarkRoast();
System.out.println(darkRoast.getDescription() + " $" + darkRoast.cost());
Beverage milkDarkRoast = new Milk(darkRoast);
System.out.println(milkDarkRoast.getDescription() + " $" + milkDarkRoast.cost());
Beverage sugarMilkDarkRoast = new Sugar(milkDarkRoast);
System.out.println(sugarMilkDarkRoast.getDescription() + " $" + sugarMilkDarkRoast.cost());
}
}
通过装饰器模式,可以灵活地组合和扩展对象的行为,而无需修改现有的类结构。这在许多需要动态扩展功能的场景中非常有用,如UI组件的装饰、流处理的管道设计等。
希望本文能够帮助读者深入理解Java中的装饰器模式,并通过实际案例掌握其应用方法。