装饰者模式,所谓装饰者模式,就是能够自由动态扩展功能,装饰者和被装饰折拥有同一个超类,比如System.IO系统,
我个人认为的装饰者模式就是 (((被装饰者)装饰者+)+装饰者)+装饰者.....无穷无尽的扩展.....
该模式也符合设计模式原则:
开-闭原则对扩展开放,对修改关闭.
优先使用组合而非继承,不过这里继承的目的不是为了获得行为而是为了匹配类型
以下以咖啡饮料为例解释装饰者模式:
1
/// <summary>
2
/// 被装饰者超类
3
/// </summary>
4
public abstract class super
5
{
6
public abstract void write();
7
}
8
/// <summary>
9
/// 装饰者继承超类
10
/// </summary>
11
public abstract class Component:super
12
{
13
public abstract void getTotal();
14
}
15![]()
16
/// <summary>
17
/// 被装饰者
18
/// </summary>
19
public class decker:super
20
{
21
string name;
22
int price;
23![]()
24
public decker(string name, int price)
25
{
26
this.name = name;
27
this.price = price;
28
}
29
public override void write()
30
{
31
Console.WriteLine(string.Format(@"我是被装饰者:{0},我的价格是{1}", name, Price));
32
}
33
}
34
/// <summary>
35
/// 装饰者
36
/// </summary>
37
public class decoratee : Component
38
{
39
string name;
40
int price;
41
super s;
42![]()
43
public decoratee(string name, int price,super s)
44
{
45
this.name = name;
46
this.price = price;
47
this.s = s;
48
}
49
public override void getTotal()
50
{
51
write();
52
}
53
public override void write()
54
{
55
s.write();
56
//自定义方法
57
Console.WriteLine(string.Format(@"我是装饰者:{0},我的价格是{1}", name, price));
58
}
59
}
60![]()
61
class Program
62
{
63
static void Main(string[] args)
64
{
65
//定义被装饰者
66
super d_1 = new decker("卡布奇诺", 15);
67
//定义被装饰者
68
Component dec_1 = new decoratee("糖", 3, d_1);
69
//循环包装
70
dec_1 = new decoratee("吸管", 2, dec_1);
71
dec_1 = new decoratee("大杯子", 2, dec_1);
72
dec_1 = new decoratee("精美包装盒", 4, dec_1);
73
dec_1 = new decoratee("牛奶", 1, dec_1);
74![]()
75
//统计
76
dec_1.getTotal();
77
Console.ReadKey();
78
}
79
}
/// <summary>2
/// 被装饰者超类3
/// </summary>4
public abstract class super5
{6
public abstract void write();7
}8
/// <summary>9
/// 装饰者继承超类10
/// </summary>11
public abstract class Component:super12
{13
public abstract void getTotal();14
}15

16
/// <summary>17
/// 被装饰者18
/// </summary>19
public class decker:super20
{21
string name;22
int price;23

24
public decker(string name, int price)25
{26
this.name = name;27
this.price = price;28
}29
public override void write()30
{31
Console.WriteLine(string.Format(@"我是被装饰者:{0},我的价格是{1}", name, Price));32
}33
}34
/// <summary>35
/// 装饰者36
/// </summary>37
public class decoratee : Component38
{39
string name;40
int price;41
super s;42

43
public decoratee(string name, int price,super s)44
{45
this.name = name;46
this.price = price;47
this.s = s;48
}49
public override void getTotal()50
{51
write();52
}53
public override void write()54
{55
s.write();56
//自定义方法57
Console.WriteLine(string.Format(@"我是装饰者:{0},我的价格是{1}", name, price));58
}59
}60

61
class Program62
{63
static void Main(string[] args)64
{65
//定义被装饰者66
super d_1 = new decker("卡布奇诺", 15);67
//定义被装饰者68
Component dec_1 = new decoratee("糖", 3, d_1);69
//循环包装70
dec_1 = new decoratee("吸管", 2, dec_1);71
dec_1 = new decoratee("大杯子", 2, dec_1);72
dec_1 = new decoratee("精美包装盒", 4, dec_1);73
dec_1 = new decoratee("牛奶", 1, dec_1);74

75
//统计76
dec_1.getTotal();77
Console.ReadKey();78
}79
}
运行结果:


浙公网安备 33010602011771号