잊지 않겠습니다.

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

  }

}

Posted by Y2K
,

하나의 옛날 Interface에서 새로운 Interface로의 전환이 이루어지고, 지원되지 않는 interface가 존재하게 될때에. 

  

  public interface IEnumerationExam

  {

    bool HasMoreElements();

    void NextElement();

  }


  public interface IIterator

  {

    bool HasNext();

    void Next();

    void Remove();

  }


  public class EnemurationIterator : IIterator

  {

    private IEnumerationExam iEnumerationExam;

    #region IIterator Members


    public bool HasNext()

    {

      return iEnumerationExam.HasMoreElements();

    }


    public void Next()

    {

      iEnumerationExam.NextElement();

    }


    public void Remove()

    {

      throw new NotSupportedException();

    }


    #endregion

  }

Posted by Y2K
,

IOldBookStoreSystem을 구현한 OldBookStore을 아래와 같이 구현되어 있는 NewBookStore에서 사용하고자 할때. 

같은 또는 비슷한 기능들이 각기 다른 interface로 구현되어 있을때 사용하는 pattern이 된다.

  

 

 public class NewBookStore

 {

   public INewBookStoreSystem bookStoreSystem;

 } 

  

  public interface INewBookStoreSystem

 {

   void BuyBook(string isbnNumber, string cardNumber);

   void ChangeBook(string cardNumber);

 } 

  

//OldBookStore

  public interface IOldBookStoreSystem

  {

    void BuyBook(string bookTitle, int costMoney);

    void ChangeBook(string bookTitle, DateTime buyDate);

    void CloseStore();

  }

  

  public class OldBookStore : IOldBookStoreSystem

  {

    public void BuyBook(string bookTitle, int costMoney)

    {

      Console.WriteLine("Buy book Title");

    }


    public void ChangeBook(string bookTitle, DateTime buyDate)

    {

      Console.WriteLine(string.Format("Change Book : {0}", buyDate));

    }


    public void CloseStore()

    {

      Console.WriteLine("Close the store.");

    }

  } 

  

이때에 새로운 INewBookStoreSystem을 이용. (INewBookStoreSystem이 adapter interface가 된다.)

  public class OldBookStoreAdapter : INewBookStoreSystem

  {

    OldBookStore oldBookStore = new OldBookStore();

    #region INewBookStoreSystem Members


    public void BuyBook(string isbnNumber, string cardNumber)

    {

      //NOTE : Find book title using isbn number

      string bookTitle = string.Empty;

      //NOTE : send bill

      int price = 1000;

      oldBookStore.BuyBook(bookTitle, price);

    }


    public void ChangeBook(string cardNumber)

    {

      //NOTE : Find card list using cardNumber

      //NOTE : Find bookTItle and buyDate


      DateTime buyDate = DateTime.Now;

      string bookTitle = string.Empty;


      oldBookStore.ChangeBook(bookTitle, buyDate);

    }


    #endregion

  } 

Posted by Y2K
,