装饰者模式是一种设计模式,它允许您通过对对象的外部进行包装,来动态地改变其行为。这个模式属于结构模式,因为它可以对已有结构进行修改,而不必改变其内容。通过增加一个装饰类,可以给原始对象添加新的功能。本文将探讨装饰者模式的基本概念、类图、实例以及适用场景。
1.基本概念
装饰者模式有三个关键类:抽象基类、具体类和装饰类。抽象基类是定义了需要包装的接口,具体类提供了各种实现,在不使用装饰类的情况下,这些类可以直接使用。装饰类能够在运行时给具体类添加新的功能。
2.类图
装饰者模式类图由四部分组成:抽象基类(Component)、具体类(ConcreteComponent)、装饰类(Decorator)以及具体装饰类(ConcreteDecorator)。
- Component:定义了需要包装的接口。
- ConcreteComponent:提供了具体实现,可以直接使用。
- Decorator:维护一个指向抽象基类的引用,并且提供了添加新功能的方法。
- ConcreteDecorator:提供了具体的装饰行为。
下面是装饰者模式的类图:

3.实例
以咖啡为例,咖啡作为抽象基类(Component),提供了描述咖啡的方法,而Espresso、DarkRoast等具体类(ConcreteComponent)则提供了各种实现。装饰类(Decorator)Milk、Mocha则提供了在咖啡中加入牛奶、摩卡等功能。具体装饰类(ConcreteDecorator)就是将Milk、Mocha等装饰类添加到具体类中的实现类。
下面是咖啡场景的实现示例代码:
```
public interface Beverage {
String getDescription();
double cost();
}
public class Espresso implements Beverage {
public String getDescription() {
return "Espresso";
}
public double cost() {
return 1.99;
}
}
public class Milk implements Beverage {
private Beverage beverage;
public Milk(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Milk";
}
public double cost() {
return .10 + beverage.cost();
}
}
public class Mocha implements Beverage {
private Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
public double cost() {
return .20 + beverage.cost();
}
}
```
4.适用场景
- 需要在不修改原始代码的情况下添加新功能。
- 需要动态地扩展功能。装饰者模式适用于动态添加新功能的情况,例如通过防火墙或安全索引添加新功能。
- 需要对功能进行分层。
扫码咨询 领取资料