31 Ocak 2020 Cuma

GoF- Mediator Örüntüsü - Enterprise Service Bus Denilebilir

Giriş
Diğer örüntüler için GoF Tasarım Örüntüleri yazısına bakabilirsiniz.

Mediator Nedir?
Mediator az kullanılan örüntülerden bir tanesi. GoF kitabındaki tanımı şöyle.
Mediator - Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently. It is responsible for coordinating interactions for a group of objects.
Şeklen şöyle

Mediator İçin Kullanılabilecek Kütüphaneler
1. C# için MediatR kullanılabilir.
2. Java'da ben Guava EventBus sınıfını Mediator olarak kullandım
3. C++'ta Mediator kodunu kendim yazmıştım

Mediator Kelimesine Alternatif Şeyler
Belki Coordinator kelimesi kullanılabilir.

1. Mediator Karmaşık Kodları Gizler
Örneğin iletişim protokollerinin detaylarını gizleyebilir. Açıklaması şöyle.
The output stream returned from the URLConnection is a Mediator. You just write data to it. It encapsulates the complex interaction needed to establish a connection and implement whatever protocol was specified in the original URL.
1.1 Mediator ve Façade Arasındaki Fark
Fark çok basit. Façade yeni bir davranış eklemez. Mevcut davranışı daha kolay kullanmamızı sağlar. Mediator ise sisteme yeni davranış ekler.

2. Mediator Belki Publish/Subscribe Olarak Da Düşünülebilir
Bazıları Mediator örüntüsünü aslında publish/subscribe ile aynı şey olarak düşünüyor.

Publish/Subscribe kelimesi 1995 yılında yazılan GoF kitabında geçmiyor. Ancak şu anda bence ikisi aynı şeyler. Aralarındaki tek fark publish/subscribe dağıtık sistemler için kullanılırken, mediator örüntüsünün aynı uygulama içinde kullanılması.

Dolayısıyla mediator örüntüsü merkezi (centralized) bir altyapıdır (infrastructure). Amacı nesneler arasında mesajlaşmayı sağlamaktır. Kendi düşünceme yakın bir cümle şöyle.
"Instead of using the Observer pattern to explicitly set many-to-many listeners and events, Mediator allows you to broadcast events globally across colleagues." — Paul Marcotte
Bu örüntüye EventHub, Event Aggregator diyenler de var. Subscribe olmak isteyen şöyle yapar.
// core.js
mediator.subscribe('newMemberAdded', function newMemberAddedHandler(id){
    this.membersModule.add(id);
});
Publish etmek isteyen şöyle yapar.
// membersUI.js
$('#addMember').click(function(){
    ...
    mediator.publish('newMemberAdded', 998);
    ...
});
2.1 Mediator ve Observer Arasındaki Fark
En temel fark şu. Her subject kendisine eklenen observer'ları içeren bir liste tutmak zorunda. Bu da her observer nesnesi içinde bir çeşit altyapı kodu olmasını gerektiriyor. Bu altyapı kodu kullanılan dile göre çok basit bir kelime ile tanımlanabilirken (örneğin C#, Java) daha karmaşık bir kütüphane kullanılmasını da gerektirebilir (örneğin boost signal).

Bir subject'in sıfır sayıda observer'ı varken, bir başka subject'in n tane observer'ı olabilir. Subject kendisine bağlı observer'ları tetikleyince observer'ların hangi sırada tetikleneceği bilinmez.

Klasik bir mediator örüntüsünde tek bir subject tipini dinleyen tek bir processor vardır. Örnek'te A subject, M mediator, B ise processor yani A nesnesi tarafından M aracılığıyla tetiklenen nesne olarak görülebilir.
  M
 / \
A   B (Processor)

Tek bir processor sayesinde yapılması gereken işler sıraya konulabilir. Dolayısıyla eğer sıralamanın önemi varsa, mediator kullanılmalıdır.



Hiç yorum yok:

Yorum Gönder