Delege deseninin gözlemci desenine göre avantajları nelerdir?


9

In temsilci desen , yalnızca bir nesne doğrudan başka nesnenin olayları dinleyebilirsiniz. Gelen gözlemci desen , nesnelerin herhangi sayısı özel nesnenin olayları dinleyebilirsiniz. Olayların diğer nesnelerini bildirmesi gereken bir sınıf tasarlarken, neden temsilci kalıbını gözlemci kalıbı üzerinde kullandınız? Gözlemci yapısını daha esnek görüyorum. Artık yalnızca bir gözlemciniz olabilir, ancak gelecekteki bir tasarımda birden fazla gözlemci gerekebilir.


4
"Delege deseni" ile ne demek istiyorsun? .Net'in delegeleri gibi bir şeyden bahsediyorsanız, istediğiniz sayıda aboneye sahip olabilirsiniz.
CodesInChaos

Yanıtlar:


7

Kendi başına delege kalıbı yoktur. Delegasyon kalıbı demek istediğinizi varsayacağım .

Anladığım kadarıyla, birbirlerinin tam tersi ve farklı amaçlar için kullanılıyorlar.

Genellikle, bir Gözlemci Deseni ile , herhangi bir sayıda gözlemci nesne ikinci bir nesne üzerindeki bir olayı dinler ve olay üzerinde hareket eder. İkinci nesnenin dinleyicileri hakkında bilgisi yoktur. Sadece onlara sesleniyor.

Bir temsilci nesnesi, yöntemleri doğrudan temsilci üzerinde çağıran ikinci nesneye iletilir. Ve aradığınız avantaj yatıyor. Birden fazla dinleyiciye tek bir mesaj göndermek yerine, tek bir nesne üzerinde (belirli bir zamanda) tam kontrole sahiptir. Ayrıca bkz . Kontrolün Ters Çevrilmesi .


6

Olaylara yanlış bakıyorsunuz. Bir gözlemci belirli bir olayın meydana geldiğini görür. Onu etkilemez veya sahiplenmez. Bir temsilci belirli bir olayı yönetir ve temsilci olayla ilgili arabirime sahip olsa bile işleyicinin sahibi olur.


1
Bir delege gerçekten bir olayın gözlemcisinden başka bir şey değildir. Bir delege görevlisinin hiçbir şeyi "işlemesine" gerek yoktur. Güvenli bir şekilde hiçbir şey yapamaz ve olayı tetikleyen örneği etkilemez (veya en azından etmemelidir).
Marjan Venema

5
@MarjanVenema - Nesne A değilse delegating nesne B'ye olay için sorumluluk, Yetkinin desen kullanmadığınız: Yalnızca bir gözlemci ile gözlemci desen kullanıyoruz.
Telastyn

Evet, ben de öyle düşünüyordum. "OnWhatever" etkinliğinin abonesi tarafından kullanılacak olay imzası türleri olarak temsil edildiğini anladım. Görünüşe göre C # delegeleri, örneğin Delphi gibi tek abone değildir.
Marjan Venema

@Marjan Venema "Bir delege bir olayın gözlemcisinden başka bir şey değildir." - konuştuğunuz dile bağlıdır. Hedef C'de, bazı delegeler veri sağlamaktan sorumludur - örneğin veri delegeleri - ve veri delegesinin eksik olduğu bir nesnenin sunacağı veri yoktur. Bu durumlarda, sadece bir şeyi gözlemleme eyleminden farklı bir heyet gerçekleşiyor.
occulus

1
@occulus: açıklama için teşekkürler. Dillerin terminoloji üzerinde anlaşamadıkları üzücü ... İnsanlar aynı kelimeler için farklı şeyler anladıklarında agnostik bir dilde programlama hakkında konuşmak biraz zorlaşıyor.
Marjan Venema

4

Bu birkaç değiş tokuş meselesi.

Trade-off:

  • esneklik (n> 1 delege / gözlemci olması açısından)
  • mesaj gönderme maliyeti
  • esneklik (delegelerin / gözlemcilerin yokluğunu sürdürme yeteneği)
  • kullanım kolaylığı

Delege deseni:

  • çok esnek değil - 1'den fazla temsilci eklemek mümkün değildir (bir çeşit "çok delege" yani gözlemci modeli anlamına gelir)
  • mesaj göndermek ucuzdur, O (1) - başka bir işlevi veya yöntemi çağırmakla aynı maliyettir (arama, mesaj kuyruğu veya diğer altyapı gerekmez)
  • genellikle esnek değildir - delegelerin hazır bulunması ve çalışmanın bir kısmını yapmaları beklenir, yani delege bilinmiyorsa gönderen başarısız olma eğilimindedir
  • kavraması kolay, uygulaması kolay

Gözlemci modeli:

  • çok esnek - tasarımda n> 1 gözlemci eklemek bekleniyor
  • mesaj gönderme maliyeti gözlemci sayısının ima ettiği bir maliyettir, O (n), yani n gözlemci zaman ve mesaj alır (en azından naif bir uygulamada)
  • genellikle dirençlidir - gözlemcilerin genellikle gönderenin bir bölümünde herhangi bir iş yapması beklenmez. Gözlemci olmasa bile gönderen etkilenmez
  • kavraması oldukça karmaşık hale gelebilir, özellikle gözlemcilerin mesajlara tepki vermesi beklenir (sıra önemlidir?, hangi gözlemci hangi yöne cevap verir?)

1

Delege kalıbı, anladığım kadarıyla, diğer dillerde, örneğin Delphi'deki olay işleyici mekanizması olarak bilinir. Bu nedenle, gözlemci modelinin büyük bir kısıtlamayla uygulanmasıdır: bir seferde sadece bir dinleyici.

Olay işleyicilerinin veya delegelerin dezavantajı açıktır: sadece bir gözlemci.

Avantaj çok açık değil: performans. Bir gözlemci deseni ile birçok gözlemci ekleyebilirsiniz. Gözlemcilerin haberdar edilmesi gereken bir olay meydana geldiğinde gözlemcileri numaralandırmanız ve her birine bir bildirim göndermeniz gerekir. Bu, özellikle bildirim gerektiren olayların sayısı da önemli olduğunda, gözlemlenen herhangi bir örneği hızla azaltabilir.


Ha? C # delegesi, bir yöntemin yalnızca değişken tip olarak (örneğin, int (*my_int_f)(int)C cinsinden eşdeğeri) imzasıdır . Her zaman yapıyı / enum gibi çalışmasını kolaylaştıracaklarını düşündüm. Bir olay, tek bir delege imzası kullanan esnek bir dinleyici dizisi için bir kancadır. Sen olabilir , ama dil sizin için daha kolay hale getirmekte olduğunu (çok farklıdır OP anlamına Heyeti Desen, farz neden olan) bir olayın olmadan bunu.
pdr

hı. Henüz C # 'da iyi değil. Delegelerin, örneğin Delphi'deki "OnWhatever" olayları tarafından kullanılan olay imza türlerine eşdeğer olduğunu anladım. Yani C # olayları birden çok dinleyici tarafından abone olabilir?
Marjan Venema

Genel Eylem <T> bir temsilci. Olaylarla ilgisi yok, etrafta dolaşan bir değişkendir. Ve evet, birden fazla dinleyici bir olayı dinleyebilir.
pdr

tamam teşekkürler, umarım düz tutabilirim ... :-) C # referansını çıkardı ve olay mekanizmasına daha fazla odaklandık.
Marjan Venema

1

Bu eski bir yazı ama yine de zil sesine gireceğim çünkü diğer cevaplar her iki kalıbı kullanırken ne olduğu ile ilgilenmiyor, teoriden pratikten daha fazla gibi görünüyorlar.

Delegasyon ve Gözlemci Nasıl Çalışır?

Delegasyon ile temsilci, potansiyel etkinliğin kaynağı oluşturulduğu anda belirli bir etkinliğe kimin yanıt vereceğini tam olarak seçer. Bu dinleyiciyi tek bir gözlemci olarak düşünebilirsiniz . Gözlemci modeli söz konusu olduğunda gözlemci, ne zaman hissettiğini gözlemlediğini seçer; gözlemci delegasyonuna gelince bağımlılıklar tersine çevrilir. Gözlemci modeli ile bir gazeteyi ve aboneleri gözlemci olarak düşünün. Gözlemciler, ilişkinin ne zaman yaratıldığını kontrol eder. Heyet ile bir çalışanı ve bir işvereni düşünün. İşveren, ilişkinin ne zaman oluşturulacağını ve tam olarak belirli olaylardan kimin sorumlu olduğunu kontrol eder. Çalışanlar hangi görevler üzerinde çalıştıklarını seçemezler.

Bazı delegasyonun bir gözlemci olabileceğini savunuyor ama bence ikisi arasındaki gerçek fark olay yönetiminin nasıl atandığı. Bir etkinlik için asla temsilci kaydı görmeyeceksiniz. Olayın gerçekleşmesine kadar olayı bile yönettiğini asla bilemez ve delege etkin bir genel yöntem çağırır.

Delegasyon Avantajı

Bu desen çok katıdır ve en düzenli tasarımlarla daha basit ve genellikle daha sağlamdır. Potansiyel olayın kaynağını ilk başlattığınızda sizi olay işleyicinizi önceden bildirmeye zorlar. Trafiği yönlendirecek birine ihtiyacınız varsa, caddeyi açmadan önce bir trafik direktörü atarsınız. Gözlemci durumunda, trafik polisinin trafiği ne zaman istediği zaman yönlendireceğini seçmesine izin verirsiniz.

Delegasyon Dezavantajı

Bu tasarımın dezavantajı esnek olmamasıdır. Bir gazeteye abone olmak için bazı kodlar uyguluyorsanız, gazete / delege hazırlayan kişinin haber hikayelerini kimlerin okuduklarını tam olarak okuyabileceklerini tam olarak tanımlaması gerekir. Gözlemci modeli ile daha sonra herhangi bir zamanda kaydedilebilirler ve gazete sadece yeni bir kişinin kaydolduğunu bilmek zorundadır.

Delegasyon Ne Zaman Seçilmeli?

Kesin olarak belirli bir gözlemciye / gözlemcilere ihtiyacınız olduğunda ve kimin gözlemlediğini değiştirmenizin bir nedeni yoksa, delegasyon modelinin katı tasarımı faydalı olacaktır.

Örneğin, belirli bir hata için bir pop-up oluşturma işlemiyle başa çıkmak için bir sınıfa / nesneye ihtiyacınız vardır. Çalışma zamanında kimin belirli bir hatayı işlediğini değiştirmenizin pek çok nedeni yoktur, bu nedenle "Bellek Dışı" hatasını tek bir varlığa devretmek mantıklı olacaktır. Bir dizi potansiyel işleyici oluşturmak ve daha sonra bu işleyicilerin "Bellek Dışı" hatası için kaydolmasını sağlamak pek mantıklı olmaz; bu durum gözlemci modelinin kullanılmasına bir örnek olacaktır. Çalışma zamanında değişken yöntemler için hangi yöntemlerin çağrıldığını veya "temsilci" nin çağrıldığını değiştirmek isteyebilirsiniz, ancak çalışma zamanında belirli bir olay için bir olay işleyicisini değiştirmek normal değildir.

Delegeleri gözlemci düzeninde yaptığınız gibi değiştirmek imkansız değil, sadece karmaşık. Gerçek dünyada belki de yeni bir temsilci trafiği idare etmek için trafik polislerini değiştirmek istersiniz. Daha iyi bir tasarımın orijinal delegeyi tek bir polis memuru değil, bir polis karakolu haline getireceği iddia edilebilir, ancak ben ...

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.