设计模式之三:装饰模式

看完装饰模式以后,觉得作者在提装饰模式之前,先把面向对象的几个原则介绍了一遍,尤其是封闭-开放原则,是很有道理的,我觉的这个装饰模式就是封闭-开放原则的一个实现例子,要添加新功能,可以,但是不修改原有的类,而是新添一个类来包装。

来看代码,先定义一个抽象类,这个类就是封闭-开放原则中说的,把一些可能要扩展的功能抽象出来:

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方法都被调用了。

装饰模式就是为已有功能动态地添加更多功能的一种方式。

当系统需要新的功能的时候,向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责和主要行为,

在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足

一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装

饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在

运行时根据需要有选择的,按顺序的使用装饰功能包装对象。

我觉得装饰模式的优点:

把类中的装饰功能从类中搬移去除,这样可以简化原有的类。有效的把类的核心职责和装饰功能区分开了。而且还

可以去除相关类中重复的装饰逻辑。

posted on 2010-03-17 11:42  狐狸的尾巴  阅读(215)  评论(0)    收藏  举报

导航