
结构型设计模式之装饰者模式.md
5星
- 浏览量: 0
- 大小:None
- 文件类型:MD
简介:
本篇文档深入浅出地介绍了装饰者(Decorator)设计模式的概念、原理及其在实际编程中的应用,帮助读者理解如何动态地给对象添加职责。
### 装饰者模式
装饰者模式是一种结构型设计模式,它允许用户在不改变原有对象的基础上动态地添加额外的职责或行为。与通过继承扩展功能相比,装饰者模式提供了更灵活的扩展方式。
#### 定义与概念
装饰者模式主要由以下几个核心角色组成:
1. **组件接口(Component)**:定义一个对象接口,可以给这些对象动态地添加职责。
2. **具体组件(ConcreteComponent)**:定义一个将要被装饰的对象,也就是真正的业务逻辑所在的类。
3. **装饰者抽象类(Decorator)**:维持一个指向组件接口对象的引用,并定义一个与组件接口一致的接口。
4. **具体装饰者(ConcreteDecorator)**:具体的装饰者类,实现装饰功能,即在组件接口对象中添加新的行为。
装饰者模式的使用场景包括:
- 在运行时需要动态给对象增加职责的情况。
- 当系统需要通过组合方式扩展功能,而不是通过继承的方式。
- 当采用继承的方式会导致类的数量爆炸性增长时,使用装饰者模式可以减少类的数量。
#### 装饰者模式的使用
装饰者模式通过组合的方式来实现对组件的装饰。装饰者对象将请求转发给它所装饰的对象,并且可能在将请求转发之前或者之后添加一些额外的功能。
下面以一个咖啡的例子来说明装饰者模式的实现。假设我们有一个简单的咖啡接口`ICoffee`,一个具体的咖啡实现`OriginalCoffee`,以及两个装饰者类`MilkDecorator`和`SugarDecorator`,它们分别代表加奶和加糖的行为。
```java
public interface ICoffee {
void makeCoffee();
}
public class OriginalCoffee implements ICoffee {
@Override
public void makeCoffee() {
System.out.print(原味咖啡);
}
}
public abstract class CoffeeDecorator implements ICoffee {
protected final ICoffee coffee;
public CoffeeDecorator(ICoffee coffee) {
this.coffee = coffee;
}
@Override
public void makeCoffee() {
coffee.makeCoffee();
}
}
public class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(ICoffee coffee) {
super(coffee);
}
@Override
public void makeCoffee() {
super.makeCoffee();
addMilk();
}
private void addMilk() {
System.out.print(加奶);
}
}
public class SugarDecorator extends CoffeeDecorator {
public SugarDecorator(ICoffee coffee) {
super(coffee);
}
@Override
public void makeCoffee() {
super.makeCoffee();
addSugar();
}
private void addSugar() {
System.out.print(加糖);
}
}
public class Client {
public static void main(String[] args) {
ICoffee coffee = new OriginalCoffee();
coffee.makeCoffee();
System.out.println();
coffee = new MilkDecorator(coffee);
coffee.makeCoffee();
System.out.println();
coffee = new SugarDecorator(coffee);
coffee.makeCoffee();
}
}
```
当程序运行时,客户端代码首先创建了一个`OriginalCoffee`对象,代表原味咖啡。然后,通过`MilkDecorator`装饰者添加了加奶的行为,再通过`SugarDecorator`装饰者添加了加糖的行为,最终输出了原味咖啡加奶再加糖的整个过程。
装饰者模式可以创建一个装饰者栈,这样可以按照需求将任意多的装饰者对象叠加到一个组件上。使用装饰者模式可以避免创建大量只是因为扩展功能而略有不同的子类。
#### 装饰者模式与代理模式的区别
装饰者模式和代理模式都是通过组合来扩展对象,但它们的重点不同。装饰者模式侧重于动态地为对象增加职责或行为,而代理模式则主要控制对对象的访问。例如,代理通常用于实现安全性、延迟加载等功能。
在结构上,一般情况下一个系统中只有一个代理类,而在装饰者模式下可能形成多个层次的装饰链(即多个装饰者叠加)。因此,在实际应用时需要根据具体需求选择合适的模式来使用。
全部评论 (0)


