装饰模式是为已有功能动态地添加更多功能的一种方式。
当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为,在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。装饰模式提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所需要装饰的对象,因此,当需要执行特性行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。
以一个衣着打扮为例子:
首先创建一个装扮者的类:
class Person
{
private string _name;
public Person()
{
}
public Person(string name)
{
this._name = name;
}
public virtual void Show()
{
Console.WriteLine("{0}今天的装扮:", _name);
}
}
再创建一个装饰类,继承自装扮者的类:
class Finery:Person
{
protected Person component;
public void Decorate(Person person)
{
this.component = person;
}
public override void Show()
{
if (this.component!=null)
{
this.component.Show();
}
}
}
最后创建几个装饰,继承自装饰类,例如:T恤、牛仔裤、运动鞋等等:
T恤类:
class TShirt:Finery
{
public override void Show()
{
base.Show();
Console.Write("T恤 ");
}
}
牛仔裤类:
class Jeans:Finery
{
public override void Show()
{
base.Show();
Console.Write("牛仔裤 ");
}
}
运动鞋类:
class Sneaker:Finery
{
public override void Show()
{
base.Show();
Console.Write("运动鞋 ");
}
}
Program类:
static void Main(string[] args)
{
Person person = new Person("小白");
Console.WriteLine("今天的打扮:");
TShirt shirt = new TShirt();
Jeans jeans = new Jeans();
Sneaker sneaker = new Sneaker();
shirt.Decorate(person);
jeans.Decorate(shirt);
sneaker.Decorate(jeans);
sneaker.Show();
}
执行的结果为: