装饰者模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
装饰者模式:动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
![](/Images/OutliningIndicators/ContractedBlock.gif)
Decorator_Patterns
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4![](/Images/OutliningIndicators/None.gif)
5
namespace Decorator_Patterns
6![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
7
class Program
8![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
9
static void Main(string[] args)
10![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
11
Beverage beverage = new Espresso();
12![](/Images/OutliningIndicators/InBlock.gif)
13
Console.WriteLine(beverage.getDescription()
14
+" $"+beverage.cost().ToString());
15![](/Images/OutliningIndicators/InBlock.gif)
16
Beverage beverage2 = new HouseBlend();
17![](/Images/OutliningIndicators/InBlock.gif)
18
Console.WriteLine(beverage2.getDescription()
19
+ " $" + beverage2.cost().ToString());
20![](/Images/OutliningIndicators/InBlock.gif)
21
beverage2 = new Mocha(beverage2);
22
Console.WriteLine(beverage2.getDescription()
23
+ " $" + beverage2.cost().ToString());
24![](/Images/OutliningIndicators/InBlock.gif)
25
beverage2 = new Mocha(beverage2);
26
Console.WriteLine(beverage2.getDescription()
27
+ " $" + beverage2.cost().ToString());
28![](/Images/OutliningIndicators/InBlock.gif)
29
beverage2 = new Whip(beverage2);
30
Console.WriteLine(beverage2.getDescription()
31
+ " $" + beverage2.cost().ToString());
32![](/Images/OutliningIndicators/InBlock.gif)
33![](/Images/OutliningIndicators/InBlock.gif)
34![](/Images/OutliningIndicators/InBlock.gif)
35
}
36
}
37![](/Images/OutliningIndicators/InBlock.gif)
38![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
39
/// 抽象类 ,饮料,调料都从此继承
40
/// </summary>
41
public abstract class Beverage
42![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
43
protected string description = "Unknown Beverage";
44![](/Images/OutliningIndicators/InBlock.gif)
45
public virtual string getDescription()
46![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
47
return description;
48
}
49![](/Images/OutliningIndicators/InBlock.gif)
50
public abstract double cost();
51
}
52![](/Images/OutliningIndicators/InBlock.gif)
53![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
54
/// 所有调料的父类,继承自Beverage
55
/// </summary>
56
public abstract class CondimentDecorator : Beverage
57![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
58![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
59
/// 所有的调料装饰者必须实现此方法
60
/// </summary>
61
/// <returns></returns>
62
public CondimentDecorator()
63![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
64
65
}
66![](/Images/OutliningIndicators/InBlock.gif)
67
}
68![](/Images/OutliningIndicators/InBlock.gif)
69![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
70
/// 浓缩咖啡
71
/// </summary>
72
public class Espresso : Beverage
73![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
74
public Espresso()
75![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
76
description = " Espresso ";
77
}
78![](/Images/OutliningIndicators/InBlock.gif)
79
public override double cost()
80![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
81
return 1.99;
82
}
83![](/Images/OutliningIndicators/InBlock.gif)
84
}
85![](/Images/OutliningIndicators/InBlock.gif)
86
public class HouseBlend : Beverage
87![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
88
public HouseBlend()
89![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
90
description =" House Blend Coffee ";
91
}
92![](/Images/OutliningIndicators/InBlock.gif)
93
public override double cost()
94![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
95
return 2.98;
96
}
97
}
98![](/Images/OutliningIndicators/InBlock.gif)
99
public class Mocha : CondimentDecorator
100![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
101
private Beverage beverage;
102
public Mocha(Beverage aBeverage)
103![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
104
105
this.beverage = aBeverage;
106
}
107![](/Images/OutliningIndicators/InBlock.gif)
108
public override string getDescription()
109![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
110
return beverage.getDescription() + ",Mocha ";
111
}
112![](/Images/OutliningIndicators/InBlock.gif)
113
public override double cost()
114![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
115
return .20 + beverage.cost();
116
}
117![](/Images/OutliningIndicators/InBlock.gif)
118![](/Images/OutliningIndicators/InBlock.gif)
119
}
120![](/Images/OutliningIndicators/InBlock.gif)
121
public class Soy : CondimentDecorator
122![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
123
private Beverage beverage;
124
public Soy(Beverage beverage)
125![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
126
this.beverage = beverage;
127
}
128![](/Images/OutliningIndicators/InBlock.gif)
129
public override string getDescription()
130![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
131
return beverage.getDescription() + ",Soy ";
132
}
133![](/Images/OutliningIndicators/InBlock.gif)
134
public override double cost()
135![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
136
return .25 + beverage.cost();
137
}
138![](/Images/OutliningIndicators/InBlock.gif)
139![](/Images/OutliningIndicators/InBlock.gif)
140
}
141![](/Images/OutliningIndicators/InBlock.gif)
142
public class Whip : CondimentDecorator
143![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
144
private Beverage beverage;
145
public Whip(Beverage beverage)
146![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
147
this.beverage = beverage;
148
}
149![](/Images/OutliningIndicators/InBlock.gif)
150
public override string getDescription()
151![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
152
return beverage.getDescription() + ",Whip ";
153
}
154![](/Images/OutliningIndicators/InBlock.gif)
155
public override double cost()
156![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
157
return .32 + beverage.cost();
158
}
159![](/Images/OutliningIndicators/InBlock.gif)
160![](/Images/OutliningIndicators/InBlock.gif)
161
}
162![](/Images/OutliningIndicators/InBlock.gif)
163![](/Images/OutliningIndicators/InBlock.gif)
164
}
165![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
1
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/dot.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
36
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
58
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
68
![](/Images/OutliningIndicators/InBlock.gif)
69
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
83
![](/Images/OutliningIndicators/InBlock.gif)
84
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
85
![](/Images/OutliningIndicators/InBlock.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
88
![](/Images/OutliningIndicators/InBlock.gif)
89
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
95
![](/Images/OutliningIndicators/InBlock.gif)
96
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
97
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/InBlock.gif)
100
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
101
![](/Images/OutliningIndicators/InBlock.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/InBlock.gif)
106
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
107
![](/Images/OutliningIndicators/InBlock.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
110
![](/Images/OutliningIndicators/InBlock.gif)
111
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
112
![](/Images/OutliningIndicators/InBlock.gif)
113
![](/Images/OutliningIndicators/InBlock.gif)
114
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
115
![](/Images/OutliningIndicators/InBlock.gif)
116
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
117
![](/Images/OutliningIndicators/InBlock.gif)
118
![](/Images/OutliningIndicators/InBlock.gif)
119
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
120
![](/Images/OutliningIndicators/InBlock.gif)
121
![](/Images/OutliningIndicators/InBlock.gif)
122
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
123
![](/Images/OutliningIndicators/InBlock.gif)
124
![](/Images/OutliningIndicators/InBlock.gif)
125
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
126
![](/Images/OutliningIndicators/InBlock.gif)
127
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
128
![](/Images/OutliningIndicators/InBlock.gif)
129
![](/Images/OutliningIndicators/InBlock.gif)
130
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
131
![](/Images/OutliningIndicators/InBlock.gif)
132
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
133
![](/Images/OutliningIndicators/InBlock.gif)
134
![](/Images/OutliningIndicators/InBlock.gif)
135
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
136
![](/Images/OutliningIndicators/InBlock.gif)
137
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
138
![](/Images/OutliningIndicators/InBlock.gif)
139
![](/Images/OutliningIndicators/InBlock.gif)
140
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
141
![](/Images/OutliningIndicators/InBlock.gif)
142
![](/Images/OutliningIndicators/InBlock.gif)
143
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
144
![](/Images/OutliningIndicators/InBlock.gif)
145
![](/Images/OutliningIndicators/InBlock.gif)
146
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
147
![](/Images/OutliningIndicators/InBlock.gif)
148
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
149
![](/Images/OutliningIndicators/InBlock.gif)
150
![](/Images/OutliningIndicators/InBlock.gif)
151
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
152
![](/Images/OutliningIndicators/InBlock.gif)
153
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
154
![](/Images/OutliningIndicators/InBlock.gif)
155
![](/Images/OutliningIndicators/InBlock.gif)
156
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/dot.gif)
157
![](/Images/OutliningIndicators/InBlock.gif)
158
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
159
![](/Images/OutliningIndicators/InBlock.gif)
160
![](/Images/OutliningIndicators/InBlock.gif)
161
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
162
![](/Images/OutliningIndicators/InBlock.gif)
163
![](/Images/OutliningIndicators/InBlock.gif)
164
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
165
![](/Images/OutliningIndicators/None.gif)