概念:
装饰者模式(Decorator Pattern): 动态地将功能添加到对象,相比生成子类更灵活,更富有弹性.
解决方案:
装饰者模式的重点是对象的类型,装饰者对象必须有着相同的接口,也也就是有着相同的结构.这样一来,在运行的过程中,就可以将这些对象融合在一起,将相同的属性等成员有机的结合,就像生成另外一种类型一样,而实际上,我们并不需要真的创建这个类型,它是动态生成的.这些装饰者既可以组合,也可以撤销组合,既回复到原来对象状态.
示例介绍:
装饰者模式的关键就是装饰者类型的定义,而其中应包括组合操作的方法.
现在我们看一下装饰者接口的定义:
代码语言:javascript复制 /// <summary>
/// 装饰者模式模型,接口
/// </summary>
public interface IDecorator
{
string Name { get; }
int Sum { get; }
void Add(IDecorator decorator);
}
接下来是装饰者类CDecorator类的定义:
代码语言:javascript复制 /// <summary>
/// 装饰者类
/// </summary>
public class CDecorator:IDecorator
{
private string myName;
private int mySum;
private ArrayList myDecorator;
public CDecorator()
{
myName = "";
mySum = 0;
myDecorator = new ArrayList();
}
//只读属性,名称
public string Name
{
get
{
string result = myName;
foreach (IDecorator d in myDecorator)
{
result = ", " d.Name;
}
return myName;
}
}
//只读属性,合计值
public int Sum
{
get
{
int result = mySum;
foreach (IDecorator d in myDecorator)
{
result = d.Sum;
}
return mySum;
}
}
//添加装饰者对象
public void Add(IDecorator decorator)
{
myDecorator.Add(decorator);
}
}
下面我们通过代码测试下这个模型:
代码语言:javascript复制 //应用测试
class Program
{
static void Main(string[] args)
{
CDecorator decoratorA = new CDecorator("decoratorA", 1);
CDecorator decoratorB = new CDecorator("decoratorB", 2);
CDecorator decoratorC = new CDecorator("decoratorC", 3);
decoratorA.Add(decoratorB);
decoratorA.Add(decoratorC);
Console.WriteLine(decoratorA.Name);
Console.WriteLine(decoratorA.Sum);
Console.Read();
}
}
运行结果如下:
应用特点
使用装饰者模式时应注意以下特点:
- 因装饰者模式一般用于动态组合对象,所以,他们一般都是临时性的,在这个模型中,我们并没有添加取消组合功能.如果需要,你可以在IDecorator接口中添加Remove()方法,并在CDecorator类中实现它.
- 不需要创建新的类型,就可以修改对象的特性(如对象的各种属性值),从而影响了对象的行为,就像创建了一个新的对象类型一样.
- 需要创建很多的相同结构的装饰者对象,以便于组合.
结束语
不要强硬的去理解设计模式,也不要强硬的去套用它的形式,你所要做的是理解它的技巧以及思想,慢慢体会你才会理解它的妙用,这是我的一点体会,希望大神多多拍砖.如果感觉不错,请推荐****