Observer Design Pattern - C#

31.10.2023 | dakika okuma

Observer Design Pattern, bir nesnenin iç durumunda meydana gelen değişiklikleri takip etmek isteyen diğer nesnelere bildirmek için kullanılır.

E-ticaret domain'indeki ürünü düşünelim. Üründeki stok ve fiyat değişikliklerini ürün ile ilgilenen ziyaretçilere bildirmek istediğimizde Observer Design Pattern'i tercih edebiliriz.

Observer Design Pattern; Subject, ConcreteSubject, Observer ve ConcreteObserver olmak üzere 4 öğeden oluşur.

Observer Design Pattern

Örneğimize göre; temel nesne Product'dır. Product, ConcreteSubject öğesidir. ObservableProduct ise Subject öğesidir. Yani temel nesnenin(Product) arayüzüdür.

ConcreteObserver, temel nesnedeki değişikliklerden haberdar olacak olan nesnelerdir. Observer ise ConcreteObserver'ların arayüzüdür.

Product için base sınıf oluşturalım ve Product'ı bu base sınıftan türetelim. İhtiyaca göre interface de tercih edilebilir.

Üründeki değişiklikleri takip etmek isteyen nesneler Attach metotu ile ürüne abone olabilirler, Detach metotu ile abonelikten çıkabilirler ama bizim örneğimizde Detach'i kullandığımız bir yer olmayacak. Notify metotu ile de ürünü takip eden nesnelere değişiklik bildirimi yapılacak. Örneğimizde Notify çağrıları UpdateStock ve UpdatePrice metotlarında yapılacak.

Stok ve fiyat değişikliklerini takip eden observer'ları ve observer'ların arayüzünü de yazalım.

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

Burada kafada soru işaretleri oluşabilir.

Birincisi, Product bir entity ise product update olmadan notify işleminin yapılmaması lazım. Doğru. EF kullanıyorsanız SaveChanges metotunda Notify edebilirsiniz. Diğer bir yol ConcreteSubject olarak Product'ı değil ProductService'i kullanılabilir. Kullanımı aşağıdaki gibi olur.

İkincisi, aynı işi Delegate/Event ile de yapabiliriz. Doğru. Observer Design Pattern nihai bir çözüm değil bir yaklaşımdır. Her dil event based bir yapıyı desteklemeyebilir. Bu tür durumlarda Observer Design Pattern tercih edilebilir.

Üçüncüsü, ürünü takip eden binlerce kişi olabilir. Ürün kaydedildiğinde binlerce kişiye bildirim atmak çok uzun sürebilir. Doğru. Bu tür durumlarda zaten Pub/Sub kullanmak daha doğru olur. Pub/Sub'ı Observer Design Pattern'in farklı bir uzantısı gibi düşünebilirsiniz. Fakat buradaki kararı şuna göre vermek gerekir. Eğer monolith bir uygulamada modüller arasında senkron olarak bildirimler yapacaksanız Observer Design Pattern'i tercih edebilirsiniz. Farklı uygulamalar arasında asenkron olarak bildirimler yapacaksanız Pub/Sub'ı tercih edebilirsiniz.

Observer Design Pattern uygulamalarını genellikle JavaScript ve oyun dünyasında görebilirsiniz.

Özetle; hem her observer'ın kendine ait sorumlulukları olduğu için Single Responsibility prensibine uygun hem mevcut kodu düzenlemeden yeni observer'lar eklenebildiği için Open-Closed prensibine uygun. Ayrıca yüksek seviyeli modül (Subject) alt seviyeli modüllere (Observers) doğrudan bağımlı olmadığı için Dependency Inversion prensibi ile de uyumlu.

Ö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.