Dekoratör (Decorator)

Eyl 08, 2013

Yapısal tasarım kalıplarından biri olan dekoratör tasarım kalıbının temel amacı, var olan nesneye, çalışma zamanında, başka sınıflar oluşturmaya gerek kalmadan yeni durum ve davranışlar eklemektir. dekoratör kalıbında nesne oluşturularak üzerinde birtakım değişiklikler, eklemeler yapılır; orijinal nesne bu değişikliklerden etkilenmez. Temel sınıf üzerinde köklü değişiklikler olmaz ve her nesne üzerinde yapılan değişiklikler birbirinden bağımsızdır.

Aşağıda dekoratör tasarım kalıbının çalışma şekli ile ilgili bir sınıf diyagramı görülmektedir.

Dekoratör Tasarım Kalıbı İle İlgili Uygulama 

Uygulamada öncelikle "Araba" adlı temel bir sınıf vardır. Bu sınıf içerisinde tanımlanan bir "Degistir" metodu vardır. Oluşturulacak olan diğer sınıflar, bu metodu farklılaştıracaklardır.

Öncelikle "Araba" adlı temel sınıf oluşturulsun:

public class Araba 
         { 
                   public string model { get; set; }     
        public int yas { get; set; } 
                   public string renk { get; set; }           
                   public virtual void Degistir()
        {
        Console.WriteLine("Araba ozellkleri eklenecek:"); 
                   } 
          }

Burada Araba sınıfının model, yas ve renk adlı metotları ile Degistir adlı sanal (virtual) metotlar oluşturuldu.

Şimdi de Araba sınıfından türeyen "ArabaDecorator" adlı soyut (abstract) bir sınıf oluşturulsun:

public abstract class ArabaDekorator : Araba
    { 
                  protected ArabaDekorator(Araba araba)
                  {
            Araba = araba;
                  } 
                  public Araba Araba 
                  { 
                            get; 
                            set; 
                  }
        public override void Degistir() 
                  { 
                   base.Degistir();
        } 
          }

Bundan sonra, ArabaDecorator adlı soyut sınıftan türetilen dekoratör sınıflar oluşturulsun:

İlk dekoratör sınıf "Yas" adıyla şu şekilde olsun:

public class Yas : ArabaDekorator    {
        public Yas(Araba araba) : base(araba)
        {
            model = Araba.model;
            yas = 3;
            renk = Araba.renk;
        }
        public override void Degistir()
        {
        base.Degistir();
        Console.WriteLine("yas ozelligi eklendi");
    }

İkinci olarak "Renk" adıyla şöyle bir dekoratör sınıf oluşturulsun:

public class Renk : ArabaDekorator
    {
        public Renk(Araba araba)

            : base(araba)
        {
            model = Araba.model;
            yas = Araba.yas;
            renk = "kırmızı";                
        }
        public override void Degistir()
        {
            base.Degistir();
            Console.WriteLine("renk ozelligi eklendi");
        }

Son olarak da "Model" adıyla bir dekoratör sınıf oluşturulsun: public class Model : ArabaDekorator
    {
        public Model(Araba araba) : base(araba)
        {
            model = "BMW";
            yas = Araba.yas;
            renk = Araba.renk;
        }
        public override void Degistir() 
        {
            base.Degistir();
            Console.WriteLine("model ozelligi eklendi");
        }
    }

 

Bu aşamalarda dikkat edilmesi gereken en önemli nokta, her kalıpta, o kalıbın türetildiği sınıftan farklılaştırılan metodudur. Çünkü dekoratör tasarım kalıbının temel özeliği, türetilen nesnelerin işlevlerini değiştirmesidir.

Sonrasında "Page_Load" metodunun içindeki kodlar yazılsın:

class Program
    {
        static void Main(string[] args)
        {
            Araba araba = new Araba();
            araba = new Yas(araba);
            araba.Degistir();
            araba = new Renk(araba);
            araba.Degistir();
            araba = new Model(araba);
            araba.Degistir();
            Console.WriteLine("yas: " + araba.yas);
            Console.WriteLine("renk: " + araba.renk);
            Console.WriteLine("model: " + araba.model);
            Console.ReadLine();
        }
    }

 

Burada ilk satırda öncelikle "Araba" adlı temel sınıftan "araba" adlı bir nesne türetilmiştir. Ardından ikinci satırda Yas kalıbının yapıcısında temel sınıfın yapıcısı çağrılır. Bu yapıcıya "araba" nesnesi parametre olarak gönderilir. Temel sınıfın yapıcısında ise, "araba" parametresi, "Araba" adlı alanda saklanır. Burada dikkat edilmesi gereken nokta, temel sınıfın "Araba" adlı alanında, şekilllenmesi istenen nesnenin kopyasının saklanıyor olmasıdır. Burada kalıp sınıfın yapıcısında model, yaş ve renk için atamalar yapılır. Ardından kalıp sınıfta "base.Degistir" satırıyla, temel sınıfın "araba.Degistir" metodu çağrılıyor ve temel sınıfta yazan "Araba özellikleri eklenecek" satırı ekranda görünür. Ardından ise kalıp sınıfta yazdırılan "yas özelliği eklendi" satırı ekranda görülür.

Aynı işlemler diğer iki kalıp sınıf için de uygulanır. Bu sınıflar için de önce temel sınıfın "araba.Degistir" metodu çalıştırılır; ardından ise o sınıfların kendi farklılaştırma metotları içindeki "renk özelliği eklendi" ve "model özelliği eklendi" satırları ekranda görülür.

Burada dikkat edilmesi gereken nokta, kodun geriye doğru giderek çalışıyor olmasıdır. "Yas" sınıfında kullanılan "base.Degistir" metoduyla temel sınıfın "araba.Degistir" metodu çağrılır.

Tüm bu işlemlerin ardından "araba" nesnesinin model, yaş ve renk özellikleri "Araba.model", "Araba.yas" ve "Araba.renk" yazılarak ekranda gösterilir.

Oluşacak ekran çıktısı şu şekildedir: