Decorator Tasarım Deseni Nedir?(What is Decorator Design Pattern?)
Decorator tasarım deseni, structural tasarım desenlerinden biridir. Bir nesneye dinamik olarak yeni özellikler eklemek için kullanılır. Kalıtım kullanmadan da bir nesnenin görevlerini artırabileceğimizi gösterir.
Not: Bir sınıfın nesnesine runtime zamanında eklenen özellikler, bu sınıftan türetilmiş diğer nesneleri etkilemez.
Ne zaman Kullanılır?
Runtime zamanında bir nesneye yeni özellikler eklemek istiyorsak kullanabiliriz.
Nasıl Kullanılır?
Decorator tasarım desenini Decorator sınıfları ve Component sınıfları şeklinde iki kısma ayırabiliriz. Component sınıfları içerisinde Decorator süper sınıfı bulunur. Yani şu şekilde bir yapı oluşturmak gereklidir:
Decorator sınıfı Component sınıfından türemiştir. Aynı zamanda Decorator sınıfı ile Component sınıfı arasında HAS-A ilişkisi vardır. Bunun anlamı, Decorator sınıfı içerisinde Component türünden instance değişken bulunur (Composition yapısı).
Decorator sınıfı abstract veya interface olabilir. Somut sınıf kullanmamak gereklidir.
Dinamik olarak özelliklerin ekleneceği nesne, ConcreteComponent sınıfından türetilir.
ConcreteDecorator nesnesi, ConcreteComponent nesnesine özelliklerin eklenmesi işlemini yapar.
Not: Decorator tasarım deseninde kalıtım, sadece sınıflar aynı türe sahip olsunlar diye kullanılmaktadır. Nesnenin fonksiyonlarını composition ile sağlıyoruz. Eğer kalıtıma bağlı kalsaydık, compile time zamanında nesnenin davranışı belirlenecekti. Böyle bir durumda ise dinamik olarak yeni özellikler ekleyemeyecektik. Bu konuyla ilgili detaylı bilgiler için aşağıdaki bağlantıları inceleyebilirsiniz:
Composition Over Inheritance
What is composition as it relates to object oriented design?
Faydaları Nedir?
1. loosely-coupled uygulamalar yapmayı sağlar.
2. Runtime zamanında(dinamik olarak) bir nesneye yeni özellikler eklenmesini sağlar.
3. Özellikleri kalıtım yolu dışında composition ve delegation ile de alınabilmesini sağlar.
4. open-closed prensibinin uygulandığı tasarım desenidir.
Open-Closed Prensibi
Tanım olarak, sınıfların geliştirilmeye açık olması, değiştirilmeye kapalı olması demektir. Bu tanıma göre uygulaması imkansız görünen open-closed prensibi, bazı nesneye yönelik programlama teknikleri ile uygulanabilmektedir. Örnek olarak Observer tasarım deseni. Hatırlarsak Observer tasarım deseninde, yeni Observer sınıfları eklerken Subject sınıfında herhangi bir değişiklik yapmıyorduk. Aynı şekilde Decorator tasarım deseni de bu prensibi uygulamaktadır.
Not: Uygulama geliştirirken, her kısımda bu prensibi uygulamak kodların karmaşıklığını artıracaktır. Eğer uygulamanızda değişmesi muhtemel kısımlar varsa, bu kısımlarda prensibi uygulamak gereklidir.
Örnek Uygulama
Bu uygulamada dekoratör tasarım desenini kullanarak çevrim içi oyun oynayan birisi marketten bir ürün aldığı zaman ödeyeceği parayı hesaplar ancak kullanıcı ön sipariş verecekse %15 lik bir indirim yapılır ve fiyat öyle gösterilir, ancak kullanıcı premium üyesi ise ek olarak da ön siparişin üzerine %12 lik bir indirim daha uygulanır ve ödeme sonuçların bu örneğimizin decoratör tasarım deseninde tasarlayıp C#kısmında kodlayalım
Kullanılacak Sınıflar
- Component olarak kullanılacak interface: IComponent
2. Somut component olarak kullanılacak sınıf: Component
3. Decorator olarak kullanılacak sınıf: DecaratorA
4. Decorator olarak kullanılacak sınıf: DecaratorB
5. Test sınıfı: Clint
Sipariş İnterfacesi
Somut component olarak kullanılacak sınıf: Component
Decorator olarak kullanılacak sınıf: DecaratorA
Decorator olarak kullanılacak sınıf: DecaratorB
Test Ortamı
Ekran Çıktısı
Son olarak da UML SINIF diyagramını gösterelim
Sabırla okuduğunuz için teşekkür ederim