装饰模式(Decorator Pattern):动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
实例: 显示一个人的穿衣
第一版: 直接使用一个Person类来实现穿衣
第二版: 把人和服饰类分开了,穿衣的一些表现通过继承与服饰类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Decorate
{
class Person
{
private string name;
public Person(string name)
{
this.name = name;
}
public void Show()
{
Console.Write(" 装扮的{0}", name);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Decorate
{
abstract class Finery //n. 华丽、优雅的服装或装饰,作为父类
{
public abstract void Show();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Decorate
{
class TShirts:Finery
{
public override void Show()
{
Console.Write(" 大T恤 ");
//throw new NotImplementedException();
}
}
class BigTrouser:Finery
{
public override void Show()
{
Console.Write(" 垮裤");
//throw new NotImplementedException();
}
}
class Sneakers:Finery
{
public override void Show()
{
Console.Write(" 球鞋");
//throw new NotImplementedException();
}
}
class Tie:Finery
{
public override void Show()
{
Console.Write(" 领带");
//throw new NotImplementedException();
}
}
class LeatherShoes:Finery
{
public override void Show()
{
Console.Write(" 皮鞋");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Decorate
{
class Program
{
static void Main(string[] args)
{
/* Person xc = new Person("小菜");
Console.Write("第一种装扮:\n");`
xc.WearTShirt();
xc.WearBigTrouser();
xc.WearSneakers();
xc.Show();
Console.Read();
*/
Person xc = new Person("小菜");
Finery dtx = new TShirts();
Finery kk = new BigTrouser();
Finery pqx = new Sneakers();
dtx.Show();
kk.Show();
pqx.Show();
xc.Show();
Console.Read();
}
}
}
第三版: 使用装饰模式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Decorate
{
class Program
{
static void Main(string[] args)
{
/* Person xc = new Person("小菜");
Console.Write("第一种装扮:\n");`
xc.WearTShirt();
xc.WearBigTrouser();
xc.WearSneakers();
xc.Show();
Console.Read();
*/
/* Person xc = new Person("小菜");
Finery dtx = new TShirts();
Finery kk = new BigTrouser();
Finery pqx = new Sneakers();
dtx.Show();
kk.Show();
pqx.Show();
xc.Show();
*/
Person xc = new Person("小菜");
Sneakers pqx = new Sneakers(); /// 使用的Person的构造函数构造的
BigTrouser kk = new BigTrouser();
TShirts dtx = new TShirts();
// 装饰过程
pqx.Decorate(xc);
kk.Decorate(pqx);
dtx.Decorate(kk);
dtx.Show();
Console.Read();
}
}
}
// 人类
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 TShirts : Finery
{
public override void Show()
{
Console.Write(" 大T恤 ");
base.Show();
//throw new NotImplementedException();
}
}
class BigTrouser : Finery
{
public override void Show()
{
Console.Write(" 垮裤");
base.Show();
//throw new NotImplementedException();
}
}
class Sneakers : Finery
{
public override void Show()
{
Console.Write(" 球鞋");
base.Show();
//throw new NotImplementedException();
}
}
class Tie : Finery
{
public override void Show()
{
Console.Write(" 领带");
base.Show();
//throw new NotImplementedException();
}
}
class LeatherShoes : Finery
{
public override void Show()
{
Console.Write(" 皮鞋");
base.Show();
}
}
装饰模式总结: 把类中的装饰功能从类中搬移出去,可以简化类,能有效的吧核心职责和装饰功能分开。取出相关类的装饰逻辑。