装饰模式
装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
以小菜的穿衣打扮为例,第一版:
<span style="font-size:24px;"><span style="font-size:24px;">#region//小菜第一版
//Person类
class Person
{
private string name;
public Person(string name)
{
this.name = name;
}
public void WearTShirts()
{
Console.Write("大T恤");
}
public void WearBigTrouser()
{
Console.Write("垮裤");
}
public void WearSneakers()
{
Console.Write("破球鞋");
}
public void WearSuit()
{
Console.Write("西装");
}
public void WearTie()
{
Console.Write("领带");
}
public void WearLeatherShoes()
{
Console.Write("皮鞋");
}
public void Show()
{
Console.WriteLine("装扮的{0}", name);
}
}
#endregion</span></span>
<span style="font-size:24px;"><span style="font-size:24px;"> #region//小菜第一版
Person xc = new Person("小菜");
Console.WriteLine("\n第一种装扮:");
xc.WearTShirts();
xc.WearBigTrouser();
xc.WearSneakers();
xc.Show();
Console.WriteLine("\n第二种装扮");
xc.WearSuit();
xc.WearTie();
xc.WearLeatherShoes();
xc.Show();
Console.Read();
#endregion</span></span>
此时,如果要添加装扮,就得修改Person类,但是,这就违背了开放封闭的原则,因此,应该把这些服饰都写成子类,第二版:
<span style="font-size:24px;">//Person类
class Person
{
private string name;
public Person(string name)
{
this.name = name;
}
public void Show()
{
Console.WriteLine("装扮的{0}", name);
}
}
//服饰抽象类
//服饰
abstract class Finery
{
public abstract void Show();
}
//各种服饰子类
//大T恤
class TShirts : Finery
{
public override void Show()
{
Console.Write("大T恤");
}
}
//垮裤
class BigTrouser : Finery
{
public override void Show()
{
Console.Write("垮裤");
}
}
//破球鞋
class Sneakers : Finery
{
public override void Show()
{
Console.Write("破球鞋");
}
}
//西装
class Suit : Finery
{
public override void Show()
{
Console.Write("西装");
}
}
//领带
class Tie : Finery
{
public override void Show()
{
Console.Write("领带");
}
}
//皮鞋
class LeatherShoes : Finery
{
public override void Show()
{
Console.Write("皮鞋");
}
}</span>
<span style="font-size:24px;"> #region//小菜第二版
Person xc = new Person("小菜");
Console.WriteLine("\n第一种装扮:");
Finery dtx = new TShirts();
Finery kk = new BigTrouser();
Finery pqx = new Sneakers();
dtx.Show();
kk.Show();
pqx.Show();
xc.Show();
Console.WriteLine("\n第二种装扮:");
Finery xz = new Suit();
Finery ld = new Tie();
Finery px = new LeatherShoes();
xz.Show();
ld.Show();
px.Show();
xc.Show();
Console.Read();
#endregion</span>
小菜扮靓第三版:
<span style="font-size:24px;">#region//小菜第三版
//Person类
class Person
{
public Person()
{ }
private string name;
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 component)
{
this.component = component;
}
public override void Show()
{
if (component != null)
{
component.Show();
}
}
}
//具体服饰类
class TShirt : Finery
{
public override void Show()
{
Console.Write("大T恤");
base.Show();
}
}
class BigTrouser : Finery
{
public override void Show()
{
Console.Write("垮裤");
base .Show ();
}
}
class Sneakers : Finery
{
public override void Show()
{
Console.Write("破球鞋");
base.Show();
}
}
class Suit : Finery
{
public override void Show()
{
Console.Write("西装");
base.Show();
}
}
class Tie : Finery
{
public override void Show()
{
Console.Write("领带");
base.Show();
}
}
class LeatherShoes : Finery
{
public override void Show()
{
Console .Write ("皮鞋");
base.Show();
}
}
#endregion</span>
<span style="font-size:24px;"> #region//小菜第三版
Person xc = new Person("小菜");
Console.WriteLine("\n第一种装扮:");
Sneakers pqx = new Sneakers();
BigTrouser kk = new BigTrouser();
TShirt dtx = new TShirt();
pqx.Decorate(xc);
kk.Decorate(pqx);
dtx.Decorate(kk);
dtx.Show();
Console.WriteLine("\n第二种装扮:");
LeatherShoes px = new LeatherShoes();
Tie ld = new Tie();
Suit xz = new Suit();
px.Decorate(xc);
ld.Decorate(px);
xz.Decorate(ld);
xz.Show();
Console.Read();
#endregion</span>
装饰模式是为已有功能,动态的添加更多功能的一种方式,当系统需要新功能的时候,是向旧的类中添加新的代码,这些新加的代码,通常装饰了原有类的核心职责或主要行为。
它们在主类中加入了新的字段,新的方法或新的逻辑,从而增加了主类的负责度,而这些新加入的东西,仅仅是为了满足一些只在某种特定情况下,才会执行的特 殊行为的需要。
装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要,有选择的、按顺序的使用装饰功能包装对象了。
装饰模式的优点是,把类中的装饰功能从类中搬移去除,这样可以简化原有的类。这样做得更大好处是,有效的把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。