1. 什么是装饰器模式?
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地将新功能添加到对象中。它通过创建一个包装类来实现,在不改变原有对象的基础上,为对象添加额外的行为。
在软件开发过程中,我们经常遇到需要给已有对象增加新功能的情况。传统的做法是直接修改原有对象的代码,但这样会导致代码的可维护性和扩展性降低。而装饰器模式提供了一种更灵活、可扩展的解决方案。
使用装饰器模式可以避免修改已有对象的代码,同时还能够动态地添加或删除功能。这样就使得系统更加灵活,并且符合开闭原则。
装饰器模式通过组合的方式,将被装饰对象作为参数传递给装饰器类的构造方法,然后在装饰器类中对被装饰对象进行包装,从而实现对被装饰对象的功能扩展。
具体步骤如下:
假设我们有一个简单的咖啡店系统,需要给咖啡添加调料。首先定义一个抽象组件接口Beverage
,表示咖啡:
public interface Beverage {
String getDescription();
double cost();
}
然后创建一个具体组件类Coffee
,实现抽象组件接口:
public class Coffee implements Beverage {
@Override
public String getDescription() {
return "Coffee";
}
@Override
public double cost() {
return 10.0;
}
}
接下来创建一个抽象装饰器类CondimentDecorator
,实现抽象组件接口,并持有一个抽象组件对象作为成员变量:
public abstract class CondimentDecorator implements Beverage {
protected Beverage beverage;
public CondimentDecorator(Beverage beverage) {
this.beverage = beverage;
}
}
最后创建具体装饰器类MilkDecorator
,继承抽象装饰器类,并在其中添加额外的功能:
public class MilkDecorator extends CondimentDecorator {
public MilkDecorator(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Milk";
}
@Override
public double cost() {
return beverage.cost() + 2.0;
}
}
使用示例代码如下:
Beverage coffee = new Coffee();
System.out.println(coffee.getDescription() + " $" + coffee.cost());
Beverage coffeeWithMilk = new MilkDecorator(new Coffee());
System.out.println(coffeeWithMilk.getDescription() + " $" + coffeeWithMilk.cost());
输出结果为:
Coffee $10.0
Coffee, Milk $12.0
装饰器模式是一种灵活、可扩展的设计模式,它通过动态地将新功能添加到对象中,实现对已有对象的功能扩展。使用装饰器模式可以避免修改原有对象的代码,同时还能够动态地添加或删除功能。这样就使得系统更加灵活,并且符合开闭原则。然而,装饰器模式也会增加系统的复杂性,需要谨慎设计装饰器类的继承关系,以及保持装饰器类的单一职责。