Mediator vs Observer?


27

Birisi bir arasındaki farklar hakkında bir kanonik cevaplarını bana sağlayabilir Observerve Mediatorve diğer üzerinden desen kullanmak gerekirken bir özeti?

Ne tür bir durumun gerektirdiğinden Observerve ne tür bir durumun gerektireceğinden emin değilim.Mediator


7 yıl sonra bu konuda kendi fikrinizi bilmek ister misiniz?
Niing

Yanıtlar:


19

Gözlemci ve Arabulucu, Tasarım Desenleri, Yeniden Kullanılabilir Nesneye Yönelik Yazılım Öğeleri terimlerini içeren orijinal kitapta , Arabulucu modelinin gözlemci deseni kullanılarak uygulanabileceği belirtilmektedir. Bununla birlikte, Meslektaşların (kabaca Gözlemci deseninin Konularına denk), bir Mediator sınıfına veya bir Mediator arayüzüne referans vermesi ile de uygulanabilir.

Gözlemci desenini kullanmak isteyeceğiniz birçok durum vardır, anahtar, nesnenin başka hangi nesnelerin durumunu gözlemlediğini bilmemesi gerektiğidir.

Arabulucu biraz daha belirgindir, sınıfların doğrudan ancak arabulucu aracılığıyla iletişim kurmasını önler. Bu, iletişimin sadece onu idare eden bir sınıfa aktarılmasını sağlayarak Tek Sorumluluk ilkesine yardımcı olur.

Klasik bir Mediator örneği, bir naif yaklaşımın "Foo paneli devre dışı bırakılmışsa ve Bar panelinde" Lütfen tarihi girin "yazan bir etiket varsa, sunucuyu aramayan bir etiket varsa, bir tıklama tıklatma etkinliğinde koda neden olabilecek bir GUI'de Aksi taktirde devam edin ", Mediator paterni ile" Sadece bir düğme olduğumu ve Foo paneli ve Bar panelindeki etiketi bilmediğin dünya çapında bir işim olmadığını söyleyebiliyordu, bu yüzden sadece sunucuyu arayıp aramadığını soracağım. Şu anda tamam. "

Veya, gözlemci kalıbı kullanılarak gerçekleştirilirse, düğme "Hey, gözlemciler (arabulucuyu da içerecek), durumum değişti (biri beni tıkladı). Dikkat ediyorsanız bir şey yapın" derdi. Benim örneğimde bu muhtemelen daha az mantıklı, ama bazen olur ve Observer ile Mediator arasındaki fark, kodun kendisindeki bir farktan daha fazla niyet olacaktır.


Teşekkürler, örnekleriniz benim için ikisi arasındaki farkları netleştirmeye gerçekten yardımcı oldu. Sizi doğru anlarsam, gözlemci modeli iletişim için bir abone / yayın sistemi kullanır; arabulucu, nesnelerin bilgi için sorgulayabileceği bazı küresel olarak erişilebilir bir varlık gibidir.
Rachel,

@Rachel - Gözlemciyi sizin gibi tanımlarım. Arabulucu muhtemelen küresel değildir, ancak kümedeki birbirleriyle iletişim kuran ama şimdi arabulucudan geçen tüm nesneler tarafından bilinir. Arabulucu bir gözlemci olarak uygulanmadığı sürece, bu durumda tüm bu nesneleri bilir (en azından gözlemlenebilir ara yüzleri aracılığıyla, belki doğrudan).
psr

9

Gözlemci düzeni, gözlemciler arasında bir koordinasyon gerekli olmadığında ve gözlemler ilişkisi bir yönde gittiğinde iyi çalışır .

Örneğin, B ve C nesnelerinin A nesnesini gözlemlemesine izin verin. A nesnesi X olayını ateşlediğinde, B nesnesi Y () yöntemini ve C nesnesi Z () yöntemini çalıştırmalıdır. BY () ve CZ () yöntemleri tamamen bağımsızsa ve koordinasyon gerektirmiyorsa, devam edin ve gözlemci desenini kullanın.

Öte yandan, eğer BY (), CZ () 'den önce gerçekleştirilmek zorundaysa, o zaman arabulucunun bu koordinasyonu içine aldığı Mediator paternini kullanmak isteyeceksiniz. Bu senaryoda, M aracı A nesnesini gözlemler ve B ve C nesnelerine referans verirdi. A olay X'i ateşlediğinde, M olayı ele alır ve belirtilen sırada BY () ve CZ () olarak çağırır.

Ayrıca, A, B ve C nesnelerinin birbirini gözetmesi gerekiyorsa, aracı olarak aracı olarak kullanmak, bu nesneleri ayırmak ve spagetti kodundan kaçınmak için uzun bir yol kullanır.


5

ObserverBir eylem bir sınıf (gözlenen sınıfı) alınan zaman kullanılan model bir sınıftaki bir reaksiyon (gözlemleyerek sınıfı) üretmek için ihtiyaç duyduğu fakat gözlenen sınıf gözlem sınıfına edilmesi için istenmeyen bir durumdur. Bu çok yaygın bir kalıptır. SAX XML ayrıştırıcısı iyi bir örnek olabilir. SAX ayrıştırıcısını kullanmak için bir istemci ContentHandler, ayrıştırıcı işlemini "gözlemlemek" için arabirimi uygular . Ayrıştırıcı, XML belgesinin öğeleriyle karşılaştığında, yöntemlerini çağırır ContentHandler. Ayrıştırıcı, müşteri kodunu çağırabilir, ancak ayrıştırıcı, müşteri koduna bağlı değildir.

MediatorDesen nesneleri kümesinin bir kullanım modelinin kapsüllemesidir. Müşteri kodu, diğer birçok sınıfa bağlanmak yerine, yalnızca arabulucuya bağlanır. Kapsüllenmiş nesnelerin ömrü, arabulucunun ömründen bağımsız olması dışında, toplanmaya benzer.


1

Basit bir ifadeyle (bunu hatırlamak için kullanıyorum):

Gözlemci: Bir nesnenin diğerindeki durum değişikliklerinden haberdar olmak istediğinde kullanın (kesinlikle konuşma, olayları gözlemlemek Gözlemcidir)

Mediator'ı anlamak için önce Cephe'yi düşündüğünüzde daha kolay buluyorum: Cephe, ayrı sınıfların işlevselliğini (bazen tüm alt sistemlerin tamamını) toplar ve bu işlevselliği tek bir arayüzde sağlar.

Arabulucu: Cephe ile aynıdır, ancak yeni sınıflandırma üretmek için tüm sınıfların işlevselliğini birleştirmesi dışında . ( Burada iyi bir açıklama )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.