Component抽象组件,在以下例子中为Photo类
ConcreteComponent具体组件,在以下例子中为MyPhoto类,继承自Photo类
Decorator装饰者抽象组件,在内部维护一个Photo的实例
装饰者组件也继承自Photo类,以下例子中为PhotoFrame抽象类
ConcreteDecorator具体装饰者,如矩形相框、椭圆相框等。
在重写Photo类相关方法的同时,会附加其它的方法
class Program
{
static void Main(string[] args)
{
//先创建一个影集
Photo photo = new MyPhoto("黄山之行影集");
//用一个矩形相框装饰它
photo = new RectangleFrame(photo);
//再用一个椭圆相框装饰它
photo = new EllipseFrame(photo);
photo.GetDescription();
}
}
/// <summary>
/// 相片基类
/// </summary>
public abstract class Photo
{
public Photo() { }
protected string _description = "未命名";
public Photo(string description)
{
_description = description;
}
/// <summary>
/// 返回相片的描述
/// </summary>
public abstract void GetDescription();
}
/// <summary>
/// 具体相片
/// </summary>
public class MyPhoto : Photo
{
public MyPhoto(string description)
: base(description)
{
}
public override void GetDescription()
{
Console.WriteLine(_description);
}
}
/// <summary>
/// 装饰类,相框
/// </summary>
public abstract class PhotoFrame : Photo
{
private Photo _photo = null;
public PhotoFrame(Photo p)
{
_photo = p;
}
public override void GetDescription()
{
if (_photo != null)
_photo.GetDescription();
}
}
/// <summary>
/// 具体的相框,矩形相框
/// </summary>
public class RectangleFrame : PhotoFrame
{
public RectangleFrame(Photo p) : base(p)
{
}
public override void GetDescription()
{
base.GetDescription();
Console.WriteLine("--已加上矩形相框");
}
}
/// <summary>
/// 具体的相框,椭圆相框
/// </summary>
public class EllipseFrame : PhotoFrame
{
public EllipseFrame(Photo p)
: base(p)
{
}
public override void GetDescription()
{
base.GetDescription();
Console.WriteLine("--加上漂亮的椭圆边框");
}
}
执行结果:

所有代码下载:
Decorator.rar (794.00 bytes)