C#'ta Decorator Design Pattern

Bu derste C#'ta Decorator Design Patternin kullanımını ele alacağız.

Decorator Design Pattern

Structural Patterns gurubunda yer alır. Hatırlaycağınız gibi Structural Patterns nesnelerin birbirleri ile olan ilişkileri temel alınarak tasarlanan desenlerdi. Çalışma zamanında (runtime) bir nesnenin yapısını bozmadan değiştirilmesi yeni yapıların (sorumluluklar) eklenmesi yada varolan yapıların çıkartılması işlemleri için kullanılır

  • Component: Bileşenin şablonu. Yeni yapıların, sorumlulukların ekleneceği nesnemizin arayüzü. Interface yada abstract class olarak tanımlanacak.:
  • ConcreteComponent: Bileşenimiz. Compenent yapısını uygulayan yapıların dinamik olarak eklendiği asıl bileşen sınıfı.
  • Decorator: Component yapısını uygulayan ayrıca Component tipinden bir nesne referansı içeren sınıf.
  • ConcreteDecorator: Bileşene yeni yapı, sorumlulukları kazandıran bileşeni genişleten sınıftır.

Biz örneğimizde bir dosya yöneticisini konumuz ile ilişkilendirmeye çalışacağız. Bir dosya yöneticimiz olacak, dosya yöneticimizin ad, kaynak, hedef özellikleri ve sadece kopyalama işlemi yapan bir metodu olacak. Biz decorator tasarım kalıbı aracılığı ile dosya yöneticimize Aç, Sil, KısaYol Oluştur gibi ek özellikler sorumluluklar kazandıracağız.

namespace ConsoleApplication1

{

// Component

abstract class ComponentBase

{

public string Ad; public string Kaynak; public string Hedef;

public abstract void Kopyala();

}


// ConcreteComponent

class ConcreteComponent : ComponentBase

{

public ConcreteComponent(string kaynak, string hedef, string ad)

{

base.Ad = ad; base.Kaynak = kaynak; base.Hedef = hedef;

}


public override void Kopyala()

{

Console.WriteLine("{0} dosya yöneticisi {1} kaynaktan {2} hedefe kopyalama işlemi yaptı.", Ad, Kaynak, Hedef);

}

}


// Decorator

abstract class DecoratorBase : ComponentBase

{

protected ComponentBase DosyaYonetici;

public DecoratorBase(ComponentBase dosyaYonetici)

{

DosyaYonetici = dosyaYonetici;

}

public override void Kopyala()

{

if (DosyaYonetici != null) DosyaYonetici.Kopyala();

}

}


// ConcreteDecorator

class ConcreteDecorator : DecoratorBase

{

public ConcreteDecorator(ComponentBase dosyaYonetici)

: base(dosyaYonetici)

{

}


public void Ac()

{

Console.WriteLine("{0} dosya yoneticisi {1} dosyasını açtı.", base.DosyaYonetici.Ad, DosyaYonetici.Kaynak);

}


public void Sil()

{

Console.WriteLine("{0} dosya yoneticisi {1} dosyasını sildi.",

base.DosyaYonetici.Ad, base.DosyaYonetici.Kaynak);

}


public void KisaYolOlustur()

{

Console.WriteLine("{0} dosya yoneticisi {1} dosyası için {2} konumunda kısayol oluşturdu.", base.DosyaYonetici.Ad, base.DosyaYonetici.Kaynak, base.DosyaYonetici.Hedef);

}


public override void Kopyala()

{

base.Kopyala();

}

}


// Client class Program

{

static void Main()

{

ConcreteComponent dosyaYonetici = new ConcreteComponent(@"c:a.txt", @"d:a.txt", "D1");

dosyaYonetici.Kopyala();

ConcreteDecorator dekoratorDosyaYonetici = new ConcreteDecorator(dosyaYonetici);

dekoratorDosyaYonetici.Sil(); dekoratorDosyaYonetici.Ac(); dekoratorDosyaYonetici.KisaYolOlustur(); dekoratorDosyaYonetici.Kopyala(); Console.Read();

}

}

}

Ekran Çıktısı

  • D1 dosya yöneticisi c:a.txt kaynaktan d:a.txt hedefe kopyalama işlemi yaptı. D1 dosya yoneticisi c:a.txt dosyasını sildi.
  • D1 dosya yoneticisi c:a.txt dosyasını açtı.
  • D1 dosya yoneticisi c:a.txt dosyası için d:a.txt konumunda kısayol oluşturdu. D1 dosya yöneticisi c:a.txt kaynaktan d:a.txt hedefe kopyalama işlemi yaptı.

 

Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git