Decorator Pattern简单随笔
“装饰模式(Decorator)”又名“包装模式(Wrapper)”,通常用来灵活地扩充对象的功能。
我们可以通过类的继承来扩充父类的功能,但这种继承方式缺乏灵活性,并且会导到子类数量的快速膨胀。恰当地使用装饰模式我们会轻松实现在控制子类数量的基础上,灵活地实现对象功能的扩展。装饰模式比类的继承更灵活。
我们可以通过类的继承来扩充父类的功能,但这种继承方式缺乏灵活性,并且会导到子类数量的快速膨胀。恰当地使用装饰模式我们会轻松实现在控制子类数量的基础上,灵活地实现对象功能的扩展。装饰模式比类的继承更灵活。
装饰模式(Decorator)描述:以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案
使用场景:
1、扩展一个类的功能,或给一个类增加附加功能
2、动态的给对象增加或删除功能
3、动态增加一组基本功能,自由组合重复使用这一组功能
组织结构:
1、抽象构件:抽象接口,作用是规范准备接收附加功能的对象
2、具体构件:准备接收附加功能的对象,继承抽象构件
3、抽象装饰:持有一个具体构件对象的实例,并定义一个与抽象构件一致的接口(也可以继承于抽象构件)
4、具体装饰:实现附加功能的对象,继承抽象装饰
使用场景:
1、扩展一个类的功能,或给一个类增加附加功能
2、动态的给对象增加或删除功能
3、动态增加一组基本功能,自由组合重复使用这一组功能
组织结构:
1、抽象构件:抽象接口,作用是规范准备接收附加功能的对象
2、具体构件:准备接收附加功能的对象,继承抽象构件
3、抽象装饰:持有一个具体构件对象的实例,并定义一个与抽象构件一致的接口(也可以继承于抽象构件)
4、具体装饰:实现附加功能的对象,继承抽象装饰
类关系图如下所示:
主要是通过OperaterDecorator这个抽象类 中的对象组合来启动原有的BASE.WORK()方法,其次是执行额外增加的功能。这个对象可以多次被包装,使实现的功能动态的增加(而使用继承的话,子类相应的会大量增加,因此不建议采用继承来解决此类问题);
额外增加的功能类代码如下:
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace DecoratorPatternSam
6 {
7 public abstract class OperaterDecorator:Operater
8 {
9 //关键点
10
11 private Operater _operater;
12 public OperaterDecorator(Operater operater)
13 {
14 this._operater=operater;
15 }
16
17 public override void Work()
18 {
19 // throw new Exception("The method or operation is not implemented.");
20 this._operater.Work();
21 }
22 }
23 }
24
25 using System;
26 using System.Collections.Generic;
27 using System.Text;
28
29 namespace DecoratorPatternSam
30 {
31 public class OperaterDecoratorA:OperaterDecorator
32 {
33 public OperaterDecoratorA(Operater _operater) : base(_operater)
34 {
35
36 }
37 public override void Work()
38 {//关键点
39 base.Work();//
40 AddedWorkMethodA();
41 }
42
43 private void AddedWorkMethodA()
44 {
45 //throw new Exception("The method or operation is not implemented.");
46 Console.WriteLine("execute added work method a");
47 }
48 }
49 }
50
51
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace DecoratorPatternSam
6 {
7 public abstract class OperaterDecorator:Operater
8 {
9 //关键点
10
11 private Operater _operater;
12 public OperaterDecorator(Operater operater)
13 {
14 this._operater=operater;
15 }
16
17 public override void Work()
18 {
19 // throw new Exception("The method or operation is not implemented.");
20 this._operater.Work();
21 }
22 }
23 }
24
25 using System;
26 using System.Collections.Generic;
27 using System.Text;
28
29 namespace DecoratorPatternSam
30 {
31 public class OperaterDecoratorA:OperaterDecorator
32 {
33 public OperaterDecoratorA(Operater _operater) : base(_operater)
34 {
35
36 }
37 public override void Work()
38 {//关键点
39 base.Work();//
40 AddedWorkMethodA();
41 }
42
43 private void AddedWorkMethodA()
44 {
45 //throw new Exception("The method or operation is not implemented.");
46 Console.WriteLine("execute added work method a");
47 }
48 }
49 }
50
51
客户端代码通过包装对象实现相应的功能:
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace DecoratorPatternSam
6 {
7 class Program
8 {
9 static void Main(string[] args)
10 {
11 OperaterA a = new OperaterA();
12 a.Work();
13 Console.WriteLine("---------------------");
14 OperaterDecoratorA decoraterA = new OperaterDecoratorA(a);
15 decoraterA.Work();
16 Console.WriteLine("---------------------");
17 OperaterDecoratorB decoraterB = new OperaterDecoratorB(decoraterA);
18 decoraterB.Work();
19 Console.WriteLine("---------------------");
20 decoraterA = new OperaterDecoratorA(decoraterB);
21 decoraterA.Work();
22 Console.ReadLine();
23 }
24 }
25 }
26
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace DecoratorPatternSam
6 {
7 class Program
8 {
9 static void Main(string[] args)
10 {
11 OperaterA a = new OperaterA();
12 a.Work();
13 Console.WriteLine("---------------------");
14 OperaterDecoratorA decoraterA = new OperaterDecoratorA(a);
15 decoraterA.Work();
16 Console.WriteLine("---------------------");
17 OperaterDecoratorB decoraterB = new OperaterDecoratorB(decoraterA);
18 decoraterB.Work();
19 Console.WriteLine("---------------------");
20 decoraterA = new OperaterDecoratorA(decoraterB);
21 decoraterA.Work();
22 Console.ReadLine();
23 }
24 }
25 }
26
显示结果如下,将额外的方法增加了进去:
//****************************动态扩充对象的功能
源代码下载地址:/Files/jasenkin/DecoratorPatternSam.rar
源代码下载地址:/Files/jasenkin/DecoratorPatternSam.rar