装饰模式(Decorator),动态的给对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
装饰模式其实就是对对象进行包装,达到每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。就好比穿裤子的时候你只把裤子穿好就行,不用关心内裤是怎么穿上的。下面还是用小菜的例子来讲解吧:
首先建立一个Person类
class Person
{
public Person()
{ }
private string name;
public Person(string name)
{
this.name = name;
}
public virtual void Show()
{
Console.WriteLine("装扮的{0}", name);
}
}
然后再建立一个服饰类,让服饰类继承Person类
//服饰类
class Finery : Person
{
protected Person component;
//打扮
public void Decorate(Person component)
{
this.component = component;
}
public override void Show()
{
if (component != null)
{
component.Show();
}
}
}
//具体服饰类
class TShirts : Finery
{
public override void Show()
{
Console.Write("大T恤");
base.Show();
}
}
class BigTrouser : Finery
{
public override void Show()
{
Console.Write("垮裤");
base.Show();
}
}
class WearSneakers : Finery
{
public override void Show()
{
Console.Write("破球鞋");
base.Show();
}
}
class WearSuit : Finery
{
public override void Show()
{
Console.Write("西装");
base.Show();
}
}
class WearTie : Finery
{
public override void Show()
{
Console.Write("领带");
base.Show();
}
}
class WearLeatherShoes : Finery
{
public override void Show()
{
Console.Write("皮鞋");
base.Show();
}
}
static void Main(string[] args)
{
Person xc = new Person("小菜");//给xc赋初值为小菜
Console.WriteLine("\n第一种装扮");
WearSneakers pqx = new WearSneakers()//用破球鞋的装饰方法
BigTrouser kk = new BigTrouser();//调用垮裤的装饰方法
TShirts dtx = new TShirts();//调用大T桖的装饰方法
pqx.Decorate(xc);//给小菜穿上破球鞋
kk.Decorate(pqx);//给穿着破球鞋的小菜穿上垮裤
dtx.Decorate(kk);//给穿着垮裤破球鞋的小菜穿上大T桖
dtx.Show();
Console.Read();
}
衣服还要一件一件穿——装饰模式,布布扣,bubuko.com
原文:http://blog.csdn.net/u010926964/article/details/22858175