装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持原类方法签名的同时,增添了额外的功能。
想学习springboot,springboot+vue项目,SpringCloudAlibaba的小伙伴,可以免费观看视频地址:
springcloudalibaba地址:
html
https://www.bilibili.com/video/BV1cFDEYWEkY/?vd_source=14d27ec13a4737c281b7c79463687112
springboot地址:
html
https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source=14d27ec13a4737c281b7c79463687112
springboot+vue案例地址:
html
```html
https://www.bilibili.com/video/BV1JLSEYJETc/?vd_source=14d27ec13a4737c281b7c79463687112
### 装饰者模式的主要角色:
1. **Component(抽象组件)**:定义了对象的接口,可以给这些对象动态地添加职责。
2. **ConcreteComponent(具体组件)**:定义了对象将引用其角色的类。
3. **Decorator(抽象装饰者)**:持有一个组件对象的引用,并定义一个与抽象组件接口相同的接口。
4. **ConcreteDecorator(具体装饰者)**:负责给组件添加额外的功能。
### Java简单案例:
假设我们有一个简单的咖啡店,我们可以订购"咖啡",但顾客也可以选择添加"牛奶"或"糖"等调料。我们可以使用装饰者模式来实现这个功能。
1. 定义抽象组件(Component)
```java
public abstract class Coffee {
public abstract String getDescription();
public abstract double cost();
}
2. 创建具体组件(ConcreteComponent)
java
public class SimpleCoffee extends Coffee {
@Override
public String getDescription() {
return "Simple Coffee";
}
@Override
public double cost() {
return 1.0;
}
}
3. 创建抽象装饰者(Decorator)
java
public abstract class CoffeeDecorator extends Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee coffee) {
this.decoratedCoffee = coffee;
}
@Override
public String getDescription() {
return decoratedCoffee.getDescription();
}
@Override
public double cost() {
return decoratedCoffee.cost();
}
}
4. 创建具体装饰者(ConcreteDecorator)
java
public class MilkCoffeeDecorator extends CoffeeDecorator {
public MilkCoffeeDecorator(Coffee coffee) {
super(coffee);
}
@Override
public String getDescription() {
return decoratedCoffee.getDescription() + ", with milk";
}
@Override
public double cost() {
return decoratedCoffee.cost() + 0.5;
}
}
public class SugarCoffeeDecorator extends CoffeeDecorator {
public SugarCoffeeDecorator(Coffee coffee) {
super(coffee);
}
@Override
public String getDescription() {
return decoratedCoffee.getDescription() + ", with sugar";
}
@Override
public double cost() {
return decoratedCoffee.cost() + 0.2;
}
}
5. 客户端代码
java
public class Client {
public static void main(String[] args) {
Coffee coffee = new SimpleCoffee();
System.out.println("Cost: " + coffee.cost() + ", Description: " + coffee.getDescription());
Coffee milkCoffee = new MilkCoffeeDecorator(coffee);
System.out.println("Cost: " + milkCoffee.cost() + ", Description: " + milkCoffee.getDescription());
Coffee milkSugarCoffee = new SugarCoffeeDecorator(milkCoffee);
System.out.println("Cost: " + milkSugarCoffee.cost() + ", Description: " + milkSugarCoffee.getDescription());
}
}
在这个案例中,SimpleCoffee
是一个具体的咖啡组件,而 MilkCoffeeDecorator
和 SugarCoffeeDecorator
是具体的装饰者,它们分别给咖啡添加了牛奶和糖。客户端代码演示了如何动态地添加装饰者来改变咖啡的描述和成本。这种模式的好处是,我们可以在不修改现有代码的情况下,通过添加更多的装饰者来扩展功能。