Decorator pattern에서는 객체에 추가적인 요소를 동적으로 첨가하는 것이 목적이다.
하나의 class에서 다른 class로 확장되어서 나가는 하나의 그림에서 다른 그림으로 확장되어 나가는 방법을 제시할 수 있으면 된다.
Decorator Pattern의 주안점은 생성자이다. 생성자에서 자신이 상속받은 interface를 인자로 받아서, 전의 객체에 장식(decorator)를 해주는 것이 최선의 방법이 된다.
using System;
namespace DecoratorPattern
{
public class Program
{
public static void Main()
{
Photo photo1 = new Photo(); //With Frame photo
Photo photo2 = new Photo(); //With Stamp & Frame Photo
PhotoFrame photoFrame = new PhotoFrame(photo1);
PhotoFrame photoFrame2 = new PhotoFrame(photo2);
PhotoStamp photoStamp = new PhotoStamp(photoFrame2);
Console.WriteLine(photoFrame.Display());
Console.WriteLine(photoStamp.Display());
Console.ReadLine();
}
}
public interface IPhoto
{
string Display();
string Print();
}
public class Photo : IPhoto
{
#region IPhoto Members
public string Display()
{
return "Display Photo";
}
public string Print()
{
return "Print Photo";
}
#endregion
}
/// <summary>
/// Photo with a Frame.
/// </summary>
public class PhotoFrame : IPhoto
{
readonly IPhoto originalPhoto;
public PhotoFrame(IPhoto originalPhoto)
{
this.originalPhoto = originalPhoto;
}
#region IPhoto Members
public string Display()
{
return originalPhoto.Display() + " with Frame";
}
public string Print()
{
return originalPhoto.Print() + " with Frame";
}
#endregion
}
public class PhotoStamp : IPhoto
{
readonly IPhoto photo;
public PhotoStamp(IPhoto photo)
{
this.photo = photo;
}
#region IPhoto Members
public string Display()
{
return photo.Display() + " with Stamp.";
}
public string Print()
{
return photo.Print() + " with Stamp";
}
#endregion
}
}