Decorator tasarım deseninin amacı nesnelere dinamik olarak run-time da yeni özellik eklemektir ve nesnenin kendisi de eklenen özelliklerden habersiz ve ayrı bir konumda olmalıdır. Yani kodun belli kısımlarında nesnelere belli özellikler kazandırmak istiyorsak ve bunu nesnenin kendi sınıfından ayrıştırılmış bir şekilde yapmak istiyorsak Decorator tasarım desenini kullanmalıyız.
Problem
Yeni bir özellik eklemek istediğimizde Component1 clasından miras alan yeni bir class oluşturacağız. Bu şekilde her yeni özellik eklemek istediğimiz de Component1'i miras alan yeni bir class oluşturmamız gerekiyor. Bu esnek bir yapı değildir. Sınıflara yetkinlik eklemek için miras kullanmanın en temel sorunu, mirasın bir compile-time(derleme zamanı) yapısı olmasıdır.
- Her yeni yetkinlik için kod değişikliği ve tekrar derleme(build) gerekir.
- Bir nesneye dinamik olarak yeni sorumluluklar nasıl eklenebilir ?
- Nesneye yeni bir özellik kazandırmak için tek yol miras değildir. Decorator pattern sayesinde miras dışında da nesneye yeni özellik kazandırabiliyoruz.
Çözüm
- Miras ile kurulan is-a ilişkisi yerine nesne bileşimi ile has-a ilişkisini kullanılır. Component interfacesini implement eden Devorator sınıfı aynı zamanda Componenet sınıfını constructerında parametre olarak almaktadır.
- Yeni sorumlulukları yeni alt sınıflarla yerine getirmektense, alt sınıf ihtiyacını doğuran şeyi bir dekorasyon/bezeme malzemesi olarak görmek ve sınıfın nesnelerine eklemek daha sağlıklıdır.
- Bu şekilde nesnenin en basit halinden başlayarak farklı dekorasyonlar uygulamak mümkün olacaktır.
Ne zaman kullanılır ?
Dekoratör pattern, sınıfları değiştirmeden genişletmek için kullanılmalıdır. Böylece Open Closed Principleye sadık kalmış oluruz. Çoğunlukla logging yada caching gibi cross-cutting concernler için kullanılır.
Sonuçlar
- Decorator kalıbı, sınıf mirasından daha esnek bir yapı sağlar.
- Çünkü bir nesnenin sahip olabileceği özellikleri-sorumlulukları önceden ön görerek sınıfa eklemek yerine, çalışma zamanında(run-time) isteğe bağlı olarak nesneye eklenmesine izin verir.
- En negatif yanı ise pek çok ufak Decorator nesnesine sahip olmamızdır.
- Esas nesne dekore edildiğinin farkında değildir. Yani dekoratör ile eklenen özellikler aslında kendi classı içerisinde barındırdığı özellikler değildir.
- Böylece esas nesnenin classı tüm gerekli gereksiz opsiyonları içerisinde barındıran büyük bir class halinden çıkmış olur.
- Tüm decorator classları birbirinden bağımsızdır.
NOT:
Decorator kalıbının Compositeden farkı, Decoratorde sorumluluk decorator nesnelerinde iken Compositede sorumluluk composite nesnededir.
Bu yüzden Decoratorde bütün-parça ilişkisi yoktur. nesnenin süreç içerisinde benzemesi söz konusudur.
Decorator adaptörden de farklıdır çünkü decorator nesnenin arayüzünü değiştirmez, sadece sorumluluk ekler. Adapter ise uyumsuz nesneye tamamen yeni bir arayüz sağlar
Decorator Pattern İmplementasyonu
Hiç yorum yok:
Yorum Gönder