装饰者模式

装饰者模式

属于结构型模式

装饰者模式动态的给一个对象添加一些额外的职责

为什么使用装饰者模式

通常使用继承类来扩展功能, 如果功能种类很多, 会造成类爆炸(类的数量很多);不方便管理
使用装饰者模式, 可以让用户决定动态的加入扩展功能;

使用装饰者模式

装饰者模式有Component(主体), (装饰部分),ConcreteComponent(具体的主体);
装饰者和具体的主体都要继承主体;装饰者内维护一个主体,并将主体进行装饰.

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
92
93
94
95
96
97
98
99
100
101
102
103
// 主体 饮品
public abstract class Drink {
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
private double price = 0.0d;
private String info;
// 计算饮品价格
public abstract double cost();
}

// 主体的实现 咖啡
public class Coffee extends Drink {
public Coffee() {
setInfo("咖啡");
setPrice(18d);
}
@Override
public double cost() {
return getPrice();
}
}

// 主体的实现 奶茶
public class MilkTea extends Drink {
public MilkTea() {
setInfo("奶茶");
setPrice(15d);
}
@Override
public double cost() {
return getPrice();
}
}

// 装饰者
public class Decorator extends Drink {
private Drink drink;
@Override
public String getInfo() {
return super.getInfo()+" "+drink.getInfo();
}
@Override
public double cost() {
return super.getPrice()+drink.cost();
}
public Decorator(Drink drink){
this.drink=drink;
}
}

// 装饰者的实现 加奶盖
public class MilkCap extends Decorator {
public MilkCap(Drink drink) {
super(drink);
setInfo("加奶盖");
setPrice(6d);
}
}

// 装饰者的实现 加芝士
public class Cheese extends Decorator {
public Cheese(Drink drink) {
super(drink);
setInfo("加芝士");
setPrice(5d);
}
}

// 测试
@Test
public void testDecorator(){
// 点一份咖啡
Drink coffee=new Coffee();
System.out.println(coffee.getInfo()+coffee.cost());
// 加一份奶盖
Drink coffee1=new MilkCap(coffee);
System.out.println(coffee1.getInfo()+coffee1.cost());
// 加一份芝士
Drink coffee2=new Cheese(coffee1);
System.out.println(coffee2.getInfo()+coffee2.cost());

System.out.println("===============================");

// 点一份奶茶
Drink milkTea=new MilkTea();
System.out.println(milkTea.getInfo()+milkTea.cost());
// 加一份芝士
Drink milkTea1=new Cheese(milkTea);
System.out.println(milkTea1.getInfo()+milkTea1.cost());
// 加一份奶盖
Drink milkTea2=new MilkCap(milkTea1);
System.out.println(milkTea2.getInfo()+milkTea2.cost());
}