装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
抽象构件(People)角色:给出一个抽象接口,以规范准备接受附加责任的对象。装饰(Clothes)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。具体装饰(TShirt和Jeans)角色:负责给构件对象 ”贴上“附加的责任。
装饰者模式的优缺点
优点:
装饰这模式和继承的目的都是扩展对象的功能,但装饰者模式比继承更灵活通过使用不同的具体装饰类以及这些类的排列组合,设计师可以创造出很多不同行为的组合装饰者模式有很好地可扩展性
缺点:装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程序变的更复杂。并且更多的对象会是的差错变得困难,特别是这些对象看上去都很像。
使用场景
需要扩展一个类的功能或给一个类增加附加责任。需要动态地给一个对象增加功能,这些功能可以再动态地撤销。需要增加由一些基本功能的排列组合而产生的非常大量的功能
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 装饰模式
{
class People
{
string m_name;
public People()
{}
public People(string name)
{
m_name = name;
}
public virtual void show()
{
Console.WriteLine("装扮的 " + m_name);
}
}
class Clothes : People
{
private People m_peo;
public void decorate(People peo)
{
m_peo = peo;
}
public override void show()
{
if (m_peo != null)
{
m_peo.show();
}
}
}
class TShirts : Clothes
{
public override void show()
{
Console.Write("大T恤 ");
base.show();
}
}
class Jeans : Clothes
{
public override void show()
{
Console.Write("牛仔裤 ");
base.show();
}
}
class Program
{
static void Main(string[] args)
{
People peo = new People("小明");
TShirts ts = new TShirts();
ts.decorate(peo);
ts.show();
Jeans js = new Jeans();
js.decorate(peo);
js.show();
}
}
}