定义
装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊对象中来为原对象动态添加功能。装饰者模式是对继承关系的有力补充。使用装饰者模式可以将一个对象的功能划分为多个可重用的属性和方法,而不是将所有功能堆叠在单个对象中。
适用场景
- 在不影响其他对象的情况下,以动态、透明且静默的方式向对象添加新职责。
- 处理那些可以撤销的职责。
- 当不能通过子类化进行扩展时,可以使用装饰者模式。
装饰者模式的角色
- Component:组件是一个接口或抽象类,它定义了被装饰对象的接口。在下面的代码中,抽象类Cake为组件。
- Concrete Component:具体组件是定义了基本行为的原始对象。在下面的代码中,BaseCake是具体组件。
- Decorator:装饰者是在运行时动态添加的对象,该对象定义了在转发请求时必须扩展的行为。在下面的代码中,抽象类Decorator为装饰者。
- Concrete Decorator:具体装饰者是向对象添加功能的实际装饰者。在下面的代码中,FruitDecorator和MeatDecorator是具体装饰者。
代码实现
下面是一个使用Java实现的装饰者模式例子,该例子是一个制作蛋糕的场景。蛋糕有一个基本的组件(BaseCake),并且可以使用不同类型的装饰品(水果和肉)进行装饰。
Component: Cake
``` java
public abstract class Cake {
private String name;
public Cake(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract double cost();
}
```
Concrete Component: BaseCake
``` java
public class BaseCake extends Cake {
public BaseCake() {
super("Base Cake");
}
@Override
public double cost() {
return 50.0;
}
}
```
Decorator: Decorator
``` java
public abstract class Decorator extends Cake {
protected Cake cake;
public Decorator(Cake cake) {
super(cake.getName());
this.cake = cake;
}
public abstract double cost();
}
```
Concrete Decorator: FruitDecorator
``` java
public class FruitDecorator extends Decorator {
public FruitDecorator(Cake cake) {
super(cake);
}
@Override
public double cost() {
return cake.cost() + 10.0;
}
}
```
Concrete Decorator: MeatDecorator
``` java
public class MeatDecorator extends Decorator {
public MeatDecorator(Cake cake) {
super(cake);
}
@Override
public double cost() {
return cake.cost() + 15.0;
}
}
```
测试类: CakeTest
``` java
public class CakeTest {
public static void main(String[] args) {
Cake cake = new BaseCake();
System.out.println("Cake: " + cake.getName() + ", cost: " + cake.cost());
cake = new FruitDecorator(cake);
System.out.println("Cake: " + cake.getName() + ", cost: " + cake.cost());
cake = new MeatDecorator(cake);
System.out.println("Cake: " + cake.getName() + ", cost: " + cake.cost());
}
}
```
输出结果:
``` java
Cake: Base Cake, cost: 50.0
Cake: Base Cake, Fruit, cost: 60.0
Cake: Base Cake, Fruit, Meat, cost: 75.0
```
分析
从上面的代码中,我们可以看到如何使用装饰者模式来设计对象。我们可以定义一个抽象组件类,一个具体组件类,一个抽象装饰者类和一个具体装饰者类,以及一个客户端类。具体装饰者类可以动态向组件添加新的行为。
优点
- 装饰者模式允许你通过动态地将对象添加到运行时环境中来扩展某些特定对象的行为。这样可以在不必扰乱代码结构的情况下轻松地给对象添加功能。
- 通过使用装饰者,你可以对对象进行无限层次的装饰。由于组件和装饰者遵循相同的接口,所以只要你的代码结构良好,就可以像搭积木一样组装新的装饰。
- 装饰者和其他模式可以一起使用。例如,你可以使用工厂方法模式来创建装饰器,并使用单例模式来限制装饰器数量。
缺点
- 在某些情况下,许多小型的具体组件类的存在可能会导致系统非常庞大且难以控制。
- 由于需要在大量对象之间“推进和传递”装饰行为,因此理解整个装饰者模式所涉及的逻辑可能很困难。
扫码咨询 领取资料