Decorator Design Pattern - C#

31.10.2023 | dakika okuma

Decorator Design Pattern, bir nesnenin davranışını bozmadan runtime'da nesneye dinamik olarak ek işlevsellikler kazandırmak için kullanılır.

Yukarıdaki gibi ürünleri dönen bir sınıfımız olduğunu varsayalım. Ürünleri cache'den getirmek gibi bir ihtiyacımız olduğunda aklımıza ilk gelen yol bu metotun içerisinde düzenleme yapmak olabilir. Birincisi, bu Single Responsibility prensibine uygun değil. İkincisi, bu sınıf projede farklı yerlerde kullanılıyor olabilir. Cache düzenlemesi yaparsak kullanılan yerlerdeki davranışı bozabiliriz. Çünkü her yerde cache'den gelmesini istemiyor olabiliriz.

Decorator Design Pattern ile bu metotta bir değişiklik yapmadan metota cache özelliği kazandırabiliriz.

Decorator Design Pattern

Decorator Design Pattern; Component, ConcreteComponent, Decorator ve ConcreteDecorator olmak üzere 4 öğeden oluşur.

Örneğimize göre; temel nesne ve yeni işlevsellikler ile sarmalanacak olan nesne ProductService'dir. ProductService, ConcreteComponent öğesidir. IProductService ise Component öğesidir. Yani temel nesnenin(Product Service) arayüzüdür.

ConcreteDecorator, temel nesneye ek işlevsellikler kazandıracak sınıflardır. Birazdan ürünleri cache'den dönmek için hazırlayacağımız sınıf ConcreteDecorator öğesidir. Decorator ise ConcreteDecorator'ların arayüzüdür.

ProductService için bir arayüz oluşturalım ve implement edelim.

Decorator'ların arayüzü için bir abstract sınıf hazırlayalım. Bu sınıf, IProductService'i implement etmeli ve constructor'da da aynı arayüzü implement eden bir sınıf almalı.

Ürünleri cache'den dönen bir servis yazalım. Bu sınıf da constructor'da IProductService'i implement eden bir sınıf almalı ve base sınıfa aktarılmalı.

Ürünleri cache'den getirmek için aşağıdaki gibi ProductService'i sarmayalayabiliriz.

Bu servise loglama özelliği de kazandırmak istediğimizi varsayalım. Bunun için de ürünleri loglayan bir servis yazalım.

Kullanımı aşağıdaki gibi olacak.

Görüldüğü üzere ProductService'e dokunmadan hem cache hem log özelliği kazandırdık. Client istediği yerde dinamik olarak bu özellikleri kullanabilir.

.NET'de Decorator Design Pattern'i uygulayan ve en bilinen sınıflar Stream sınıflarıdır. Aşağıdaki örnekte FileStream'i GZipStream ile sarmalayıp veriyi sıkıştırılmış şekilde kaydedebiliriz.

Hem her decorator'ın yalnızca bir sorumluluğu olduğu için Single Responsibility prensibine uygun hem de mevcut kodu değiştirmeden yeni işlevsellikler kazandırılabildiği için Open-Closed prensibine uygun.

Örnek koda aşağıdaki Github adresimden erişebilirsiniz.

ahmetkucukoglu/design-patterns

Design Patterns C#

C#
2
0

Vesselam.

Yazıyı Paylaş

Yorum bırak

Yanıtla

Yanıtlamayı iptal et
Bu site reCAPTCHA tarafından korunmaktadır ve Google Gizlilik Politikası ve Hizmet Şartları geçerlidir. Yorumunuz başarılı şekilde gönderildi reCaptcha doğrulanamadı
Muhabbetle ASP.NET Core ile geliştirildi.