1.定义
装饰模式(Decorator),动态的给对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
2.理解
装饰模式其实就是对对象进行包装,达到每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。就好比穿裤子的时候你只把裤子穿好就行,不用关心内裤是怎么穿上的。下面还是用小菜的例子来讲解吧:
3.实例
首先建立一个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();
}
注意这里就是在给小菜穿垮裤的时候不用关心破球鞋是怎么穿上的,同样穿大T桖的时候不用关心垮裤是怎么穿上的。这样在写代码的时候就能有效地把类的核心职责和装饰功能区分开了,而且可以去除类中重复的装饰逻辑。再想想穿衣服的时候一件一件穿是不是比裤子T桖同时速度要快呢?