装饰模式采用对象组合而非继承的手法,实现在运行时动态的扩展对象功能的能力,它强调的是扩展接口。
装饰器模式角色:
◊Component:定义一个对象接口,可以给这些对象动态地添加职责。
◊ConcreteComponent:定义一个对象,可以给这个对象添加一些职责。
◊Decorator:维持一个指向Component的指针,并定义一个与Component接口一致的接口。
◊ConcreteDecorator:负责向ConcreteComponent添加功能。
装饰模式适用情形:
◊ 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
◊ 处理那些可以撤销的职责
结构图:
namespace Libraries.Test.DesignPattern.Decorator
{
public interface IPicture
{
string Draw();
}
}
namespace Libraries.Test.DesignPattern.Decorator
{
public class Picture : IPicture
{
public string Draw()
{
return "一幅美丽的画";
}
}
}
namespace Libraries.Test.DesignPattern.Decorator
{
public class PictureDecorator : IPicture
{
protected IPicture picture;
public PictureDecorator(IPicture picture)
{
this.picture = picture;
}
public string Draw()
{
string str = "";
if (this.picture != null)
{
str = this.picture.Draw();
}
return str;
}
}
}
namespace Libraries.Test.DesignPattern.Decorator
{
public class PlasticFrame : PictureDecorator
{
public PlasticFrame(IPicture picture) : base(picture)
{ }
public string AddPlasticFrame()
{
string str = "-----给画添加一个塑料框------";
str += Draw();
return str;
}
}
}
namespace Libraries.Test.DesignPattern.Decorator
{
public class WoodenFrame : PictureDecorator
{
public WoodenFrame(IPicture picture) : base(picture)
{ }
public string AddWoodenFrame()
{
string str = "-----给画添加一个木框------";
str += Draw();
return str;
}
}
}
namespace Libraries.Test.DesignPattern.Decorator
{
public class Client
{
public void Excute()
{
IPicture picture = new Picture();
//用木框裱起来的画
WoodenFrame woodenFrame = new WoodenFrame(picture);
string woodenFrameStr = woodenFrame.AddWoodenFrame();
//用塑料框裱起来的画
PlasticFrame plasticFrame = new PlasticFrame(picture);
string plasticFrameStr = plasticFrame.AddPlasticFrame();
}
}
}