装饰器模式

模式定义

在不改变原有对象的基础上,将功能附加到对象上。

image-20230422163657266

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
80
81
82
83
84
85
86
87
88
89
90
91
public class DecoratorTest {
public static void main(String[] args) {
// 获取原茶
Beverage beverage = new Coffee();
// 加配料
beverage = new Lemon(beverage);
// 加配料
beverage = new Pearl(beverage);
System.out.println(beverage.getDescription()+"价格:"+beverage.cost());
}
}
// 原茶
interface Beverage{
// 返回描述
String getDescription();
// 返回价格
double cost();
}
class BlackTea implements Beverage{
@Override
public String getDescription() {
return "红茶☕️";
}
@Override
public double cost() {
return 10;
}
}
class GreenTea implements Beverage{
@Override
public String getDescription() {
return "绿茶🍵";
}
@Override
public double cost() {
return 10;
}
}
class Coffee implements Beverage{

@Override
public String getDescription() {
return "咖啡☕️";
}

@Override
public double cost() {
return 12;
}
}
// 调料
abstract class Condiment implements Beverage{

}

// 加柠檬
class Lemon extends Condiment{
private Beverage beverage;
public Lemon(Beverage beverage) {
this.beverage = beverage;
}

@Override
public String getDescription() {
return beverage.getDescription()+"加柠檬🍋";
}

@Override
public double cost() {
return beverage.cost()+2;
}
}

// 加珍珠
class Pearl extends Condiment{

private Beverage beverage;

public Pearl(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+"加珍珠";
}

@Override
public double cost() {
return beverage.cost()+3;
}
}

应用场景

扩展一个类的功能或给一个类添加附加职责

优点

1.不改变原有对象的情况下给予一个对象扩展功能

2.使用不同的组合可以实现不同的效果

3.符合开闭原则

经典应用

1
2
3
Servlet.Api;
javax.servlet.http.HttpServletRequestWrapper;
javax.servlet.http.HttpServletResponseWrapper;