装饰器模式
模式类型:
结构型
定义:装饰器模式(Decorator Pattern)
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你动态地给对象添加新的功能,而不改变其结构。这种模式创建了一个装饰类,用来包装原始类,并在保持类接口完整的同时,提供额外的功能。装器(Wrapper)
工作原理
0
1
2
| • 动态扩展功能:可以在运行时添加或删除功能。
• 组合而非继承:使用组合的方式添加功能,而不是通过继承。
• 透明性:客户端无需知道对象是否被装饰,可以透明地使用。
|
2、原理uml图
1、结构
1. 组件接口(Component):定义对象的接口。
2. 具体组件(ConcreteComponent):实现组件接口的类。
3. 装饰器类(Decorator):实现组件接口,并持有一个组件对象的引用。
4. 具体装饰器(ConcreteDecorator):继承装饰器类,并添加新的功能。
实例:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
// 基础接口
public interface IceCream {
String getDescription();
double cost();
}
// 基本实现:香草冰淇淋
public class VanillaIceCream implements IceCream {
public String getDescription() {
return "Vanilla Ice Cream";
}
public double cost() {
return 1.0; // 基本冰淇淋的价格
}
}
// 装饰器基类
public abstract class IceCreamDecorator implements IceCream {
protected IceCream decoratedIceCream;
public IceCreamDecorator(IceCream iceCream) {
this.decoratedIceCream = iceCream;
}
public String getDescription() {
return decoratedIceCream.getDescription();
}
public double cost() {
return decoratedIceCream.cost();
}
}
// 巧克力酱装饰器
public class ChocolateSauceDecorator extends IceCreamDecorator {
public ChocolateSauceDecorator(IceCream iceCream) {
super(iceCream);
}
public String getDescription() {
return decoratedIceCream.getDescription() + ", Chocolate Sauce";
}
public double cost() {
return decoratedIceCream.cost() + 0.5; // 巧克力酱的价格
}
}
// 坚果装饰器
public class NutsDecorator extends IceCreamDecorator {
public NutsDecorator(IceCream iceCream) {
super(iceCream);
}
public String getDescription() {
return decoratedIceCream.getDescription() + ", Nuts";
}
public double cost() {
return decoratedIceCream.cost() + 0.7; // 坚果的价格
}
}
public class Main {
public static void main(String[] args) {
// 创建一个基本的香草冰淇淋
IceCream iceCream = new VanillaIceCream();
System.out.println(iceCream.getDescription() + " $" + iceCream.cost());
// 添加巧克力酱
iceCream = new ChocolateSauceDecorator(iceCream);
System.out.println(iceCream.getDescription() + " $" + iceCream.cost());
// 再添加坚果
iceCream = new NutsDecorator(iceCream);
System.out.println(iceCream.getDescription() + " $" + iceCream.cost());
}
}
|
4、应用场景
0
1
| 1、咖啡里加糖 加牛奶
2、JDK 中 输入/输出流
|
参考资料
设计模式资料常用结构性模型
设计模式-视频讲解
设计模式-原则