22 Temmuz 2019 Pazartesi

GoF - Decorator Örüntüsü

Decorator İsmi
Decorator için isim seçmek her zaman en büyük problem :)
- FilteredCollectionDelegationWork gibi isimlerin iyi olmadığını düşünenler var.

Decorator - Yapısal Örüntü
Decorator bir yapısal örüntüdür. En önemli faydaları nesneleri birleştirerek daha geniş yapılar oluşturması, kalıtım hiyerarşisinde niceliğin artmasını engellemesi (explosion of subclasses) ve legacy kodlarda, kalıtıma dokunmadan değişiklik yapabilmeyi kolaylaştırması olarak sayılabilir.

Bu örüntü iki şekilde gerçekleştirilebilir.
1. Kaltım Kullanarak
2. Kalıtım Kullanmadan Sadece Sarmalayarak. Bu kullanımda ismine sadece Wrapper demek daha doğru olabilir.

Her iki kullanımda da amaç gerçek nesneyi sarmalayarak davranışını değiştirmektir. Böylece o ana kadar sınıf hiyerarşisinde olmayan yeni bir davranış şekli elde edilebilir. Açıklaması şöyle.
Decorators dynamically alter the functionality of a function, method, or class without having to directly use subclasses or change the source code of the function being decorated.
Decorator ile "Attribute,Aspect,Trait" arasında farklılıklar bulunur.

Decorator ve Arayüzden Kalıtım - Birinci Kullanım Şekli
Decorator Örüntüsü - Kalıtım Kullanarak yazısına taşıdım.

Sarmalama İşlemi - İkinci Kullanım Şekli
Sarmalama işleminde sınıfa Wrapper demek daha iyi. Bir yorum şöyle
Trust me, "Decorator" doesn't make any sense in English either. The reason you see this term is due to the influence of a software pattern book written 20 years ago by the so-called "Gang of Four." They described patterns in common use but decided to give them their own, sometimes odd names. "Decorator" is one example. Everyone I knew called this a "Wrapper" class because you "wrap" other classes inside another. Much more descriptive, don't you think?
Buna verilen cevap şöyle.
"Decorator" refers to the pattern's purpose, whereas "Wrapper" refers to the pattern's form.
Örnek
Sarmalama işlemini şöyle yaparız.
TextEmail txtEmail = new TextEmail();
SecuredEmail securedEmail = new SecuredEmail (txtEmail);
Decorator ve Proxy
Decoeator ve Proxy birbirlerine çok benziyorlar. Proxy şöyledir

Decorator ve Private Alanlar
Decorator, davranışını değiştirmek istediği nesnenin private alanlarına erişme konusunda sıkıntı çekebilir. Bu alanları public yapmak istemiyorsak reflection kullanmak gerekebilir.

Decorator Örüntüsüne Çok Benzeyen Nesneye Özellik Ekleme ve Çıkarma
Bazen nesneler belli özellikleri listeler halinde tutarlar. Örneğin roller gibi. Rollerin eklenip çıkarılması davranışı değiştirmiyor sadece nesneye veri ekleyip çıkarıyorsa decorator'e gerek yoktur.

Decorator ve Mock
Decorator ve Mock nesnesi içerdikleri nesneyi taklit ettikleri, yani oymuş gibi davrandıkları için bir açıdan benzerler. Ancak kullanım sahaları tamamen farklıdır. Decorator gerçek kodun içinde kullanılırken, Mock nesneleri kodu test etmek için kullanılırlar.

Hiç yorum yok:

Yorum Gönder