设计模式之三:装饰模式
看完装饰模式以后,觉得作者在提装饰模式之前,先把面向对象的几个原则介绍了一遍,尤其是封闭-开放原则,是很有道理的,我觉的这个装饰模式就是封闭-开放原则的一个实现例子,要添加新功能,可以,但是不修改原有的类,而是新添一个类来包装。
来看代码,先定义一个抽象类,这个类就是封闭-开放原则中说的,把一些可能要扩展的功能抽象出来:
1 /// <summary>
2 /// 该抽象类是定义了一个接口对象,可以给这些对象动态的添加职责
3 /// </summary>
4 abstract class Component
5 {
6 public abstract void Operation();
7 }
在这个基类基础上,派生出具体的对象类:
ConcreteComponent 代码
1 /// <summary>
2 /// 定义一个具体的对象,可以给这个对象添加一些职责
3 /// </summary>
4 class ConcreteComponent : Component
5 {
6 /// <summary>
7 /// 重写基类的Operation方法
8 /// </summary>
9 public override void Operation()
10 {
11 Console.WriteLine("具体对象的操作");
12 }
13 }
再定义个装饰类:
Decorator 代码
1 /// <summary>
2 /// 定义一个装饰类,继承Component
3 /// </summary>
4 class Decorator : Component
5 {
6 protected Component component;
7
8 /// <summary>
9 /// 设置传入的Component对象
10 /// </summary>
11 /// <param name="component">Component对象</param>
12 public void SetComponent(Component component)
13 {
14 this.component = component;
15 }
16
17 /// <summary>
18 /// 重写Operation方法,实际调用的是传入的Component对象的Operation方法
19 /// </summary>
20 public override void Operation()
21 {
22 if (component != null)
23 {
24 component.Operation();
25 }
26 }
27 }
定义两个具体的装饰类:
具体装饰类代码
1 class ConcreteDecoratorA : Decorator
2 {
3 private string addedState;
4
5 public override void Operation()
6 {
7 base.Operation();
8 addedState = "New State";
9 Console.WriteLine("具体装饰对象A的操作");
10 }
11 }
12
13 class ConcreteDecoratorB : Decorator
14 {
15 public override void Operation()
16 {
17 base.Operation();
18 AddedBehavior();
19 Console.WriteLine("具体装饰对象B的操作");
20 }
21
22 private void AddedBehavior()
23 {
24 }
25 }
客户端代码:
客户端代码
1 static void Main(string[] args)
2 {
3 ConcreteComponent c = new ConcreteComponent();
4 ConcreteDecoratorA d1 = new ConcreteDecoratorA();
5 ConcreteDecoratorB d2 = new ConcreteDecoratorB();
6
7 d1.SetComponent(c);
8 d2.SetComponent(d1);
9 d2.Operation();
10
11 Console.Read();
12 }
在客户端中,首先定义了一个ConcreteComponent类,这个类中有个Operator方法,然后定义了两个具体的
然后的d1装饰了c这个对象,d2又装饰了d1对象,这时候调用d2的Operator方法,就发现,被先后装饰的c,d1
对象的Operator方法都被调用了。
装饰模式就是为已有功能动态地添加更多功能的一种方式。
当系统需要新的功能的时候,向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责和主要行为,
在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足
一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装
饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在
运行时根据需要有选择的,按顺序的使用装饰功能包装对象。
我觉得装饰模式的优点:
把类中的装饰功能从类中搬移去除,这样可以简化原有的类。有效的把类的核心职责和装饰功能区分开了。而且还
可以去除相关类中重复的装饰逻辑。

浙公网安备 33010602011771号