简介
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
书中实例
小菜准备去和MM约会,正好碰见在家的大鸟,小菜本来想让大鸟给他出出主意,没想到被大鸟逮个正着。今天还没学设计模式呢,正好借着穿衣搭配,我们来学装饰模式……
装饰模式实现程序
//Person类(ConcreteCompontent)
class Person
{
public Person()
{ }
private string name;
public Person(string name)
{
this.name = name;
}
public virtual void Show()
{
Console.WriteLine("装扮的{0}", name);
}
}
//服饰类(Decorator)
class Finery : Person
{
protected Person component;
//打扮
public void Decorate(Person component)
{
this.component = component;
}
public override void Show()
{
if (component != null)
{
component.Show();
}
}
}
//具体服装类(ConcreteDecorator)
class TShirts : 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();
}
}
//客户端代码
class Program
{
static void Main(string[] args)
{
Person xc = new Person("小菜");
Console.WriteLine("\n第一种装扮: ");
Sneakers pqx = new Sneakers();
BigTrouser kk = new BigTrouser();
TShirts dtx = new TShirts();
//装饰过程
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.ReadKey();
}
}
组成类图说明
关系介绍
具体构成类(ConcreteComponent)和装饰类(Decorator)是构成类(Component)的子类,它们之间是继承的关系。同时,装饰类和构成类又是聚合关系,构成类拥有装饰类,但装饰类不是构成类的内部成分。有N个具体装饰类是装饰类的子类,它们继承于装饰类,起到添加职责的功能。
装饰模式的构成
Component(构成类):它定义了一个对象接口,可以给这些对象动态地添加职责。
ConcreteComponent(具体构成类)是定义了一个具体的对象,也可以给这个对象添加一些职责。
Decorator(装饰抽象类)继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。
ConcreteDecorator(具体装饰类):它就是具体的装饰对象,起到给Component添加职责的功能。
装饰模式的优缺点
优点:1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
缺点:
1. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
2. 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。
使用场景
1. 需要扩展一个类的功能,或给一个类添加附加职责。
2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。