介绍: 装饰器模式是一种结构型设计模式,它允许在运行时为对象动态添加新的功能,同时又不改变其结构。装饰器模式通过将对象包装在一系列装饰器中,从而实现对对象的透明包装和扩展。这样,我们可以根据需要动态地添加或删除功能,而不必修改原始对象或现有代码。装饰器模式在Java中的应用非常广泛,它提供了一种优雅的方式来扩展对象的功能。
场景: 在许多情况下,我们需要对一个对象进行功能扩展,但是又不希望修改原始对象的代码。例如,在一个咖啡店中,我们可能需要为咖啡添加不同的配料,如牛奶、糖和巧克力。此时,装饰器模式就可以派上用场。
实现: 让我们通过一个简单的示例来理解装饰器模式的实现。假设我们正在开发一个咖啡店程序,需要为咖啡添加不同的配料。首先,我们定义一个咖啡接口:
public interface Coffee {
double getCost();
String getDescription();
}
然后,我们实现具体的咖啡类:
public class SimpleCoffee implements Coffee {
@Override
public double getCost() {
return 5.0;
}
@Override
public String getDescription() {
return "Simple Coffee";
}
}
接下来,我们定义一个装饰器抽象类,它也实现了咖啡接口:
public abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee decoratedCoffee) {
this.decoratedCoffee = decoratedCoffee;
}
@Override
public double getCost() {
return decoratedCoffee.getCost();
}
@Override
public String getDescription() {
return decoratedCoffee.getDescription();
}
}
然后,我们创建具体的装饰器类,用于给咖啡添加配料:
public class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(Coffee decoratedCoffee) {
super(decoratedCoffee);
}
@Override
public double getCost() {
return super.getCost() + 2.0;
}
@Override
public String getDescription() {
return super.getDescription() + ", Milk";
}
}
public class SugarDecorator extends CoffeeDecorator {
public SugarDecorator(Coffee decoratedCoffee) {
super(decoratedCoffee);
}
@Override
public double getCost() {
return super.getCost() + 1.0;
}
@Override
public String getDescription() {
return super.getDescription() + ", Sugar";
}
}
在客户端代码中,我们可以动态地为咖啡添加不同的配料:
public class Client {
public static void main(String[] args) {
Coffee simpleCoffee = new SimpleCoffee();
System.out.println("Cost: " + simpleCoffee.getCost() + ", Description: " + simpleCoffee.getDescription());
Coffee coffeeWithMilk = new MilkDecorator(simpleCoffee);
System.out.println("Cost: " + coffeeWithMilk.getCost() + ", Description: " + coffeeWithMilk.getDescription());
Coffee coffeeWithMilkAndSugar = new SugarDecorator(coffeeWithMilk);
System.out.println("Cost: " + coffeeWithMilkAndSugar.getCost() + ", Description: " + coffeeWithMilkAndSugar.getDescription());
}
}
输出:
Cost: 5.0, Description: Simple Coffee
Cost: 7.0, Description: Simple Coffee, Milk
Cost: 8.0, Description: Simple Coffee, Milk, Sugar
在上面的示例中,我们成功地使用了装饰器模式,动态地为咖啡添加不同的配料,而不改变原始咖啡对象的代码。
总结: 装饰器模式是一种灵活而优雅的设计模式,它允许在运行时动态地为对象添加新的功能。通过使用装饰器模式,我们可以实现透明的对象包装和功能扩展,而不必修改原始对象或现有代码。在实际开发中,装饰器模式可以应用于各种场景,例如文件流处理、UI组件定制等,是值得掌握的一种设计模式。