Frage

Nachdem ich das Buch „Head First Design Patterns“ gelesen und eine Reihe anderer Designmuster verwendet habe, versuche ich, das Observer-Muster zu verstehen.Ist dies nicht bereits mithilfe von Events im .NET Framework implementiert?

War es hilfreich?

Lösung

Ja ist es.Das Beobachtermuster wird auch als Publish/Subscribe-Muster bezeichnet und ist genau das, was Ereignisse ermöglichen.

Andere Tipps

Ich würde sagen: Ja, es war Anders Heljsbergs Absicht, das Beobachtermuster basierend auf seiner Erfahrung mit Delphi zu einem erstklassigen Sprachfeature mit Ereignissen in C# zu machen.Anders macht diese und andere Designabsichten in einem hervorragenden Interview deutlich Software-Engineering-Radio.

Ja, es ist identisch.

Eine Notiz:Wenn Sie Ereignisse wirklich verstehen möchten, empfehle ich, das Beobachtermuster zu erlernen und es eine Zeit lang selbst umzusetzen.Wenn Sie es vollständig verstanden haben, hören Sie auf, es selbst zu tun, und verwenden Sie die professionelle und gut dokumentierte Implementierung, es sei denn, Sie haben einen echten Bedarf, etwas anderes zu tun.

Das ist richtig, Ereignisse sind eine Implementierung des Beobachtermusters.Ich habe jedoch Diskussionen von Leuten gelesen, die immer noch ihre eigenen schreiben, um ihnen entweder mehr Flexibilität zu geben oder vielleicht einfach nur, um die ereignisauslösende Syntax zu vermeiden.

Ja, aber die explizite Programmierung des Beobachtermusters und der Verzicht auf die Verwendung von Delegaten und Ereignissen kann zu einem einfacheren Debuggen Ihres Codes führen.

Bedenken Sie den Unterschied:

public void NotifyObservers()
{
    foreach(Product product in ProductList)
    {
        if (product is IProductObserver)
        {
               product.Update(this)
        }
    }
}

Hier ist ganz klar ersichtlich, welche Produkte in der Liste über eine Änderung benachrichtigt werden.Während des Debuggens können Sie die ProductList überprüfen ...

Bei der Verwendung von Delegierten und Ereignissen kann es umständlicher sein, herauszufinden, wie viele „Delegierte“ tatsächlich für die Abwicklung des Ereignisses „abonniert“ wurden.

Die meisten modernen Sprachen unterstützen einige der Entwurfsmuster nativ.Es wurde argumentiert, dass Sprachen umso besser sind, je mehr Muster sie nativ unterstützen, ohne dass sie explizit implementiert werden müssen, und dass Lisp in dieser Hinsicht hervorragend ist.Jeff hatte etwas zu sagen auch darüber.

Microsoft Selbst besagt, dass die Verwendung von Ereignissen und Delegaten die c#-Methode zur Anwendung des Observer-Musters ist.Unter Verwendung einiger grundlegender Namenskonventionen für Ereignisse und Delegierte benannten sie ihr eigenes Muster als „Ereignismuster“ was genau das Gleiche bewirkt und einige zusätzliche Vorteile gegenüber dem Klassiker bietet Beobachtermuster.

„Ereignismuster“ wird in der MSDN-Bibliothek im Abschnitt „Erkundung des Observer-Entwurfsmusters" Artikel.

Referenz-MSDN-Artikel

Basierend auf Ereignissen und Delegierten verwendet die FCL das Observer-Muster recht häufig.Die Designer des FCL haben die inhärente Leistungsfähigkeit dieses Musters voll erkannt und es sowohl auf die Benutzeroberfläche als auch auf nicht-UI-spezifische Funktionen im gesamten Framework angewendet.Diese Verwendung ist jedoch eine leichte Variation des Basis-Observer-Musters, das das Framework-Team als Ereignismuster bezeichnet hat.Im Allgemeinen wird dieses Muster als formale Namenskonventionen für Delegierte, Ereignisse und verwandte Methoden ausgedrückt, die am Ereignisbenachrichtigungsprozess beteiligt sind.Microsoft empfiehlt, dass alle Anwendungen und Frameworks, die Ereignisse und Delegaten verwenden, dieses Muster übernehmen, obwohl es in der CLR oder im Standard-Compiler keine Durchsetzung gibt

Basierend auf dieser Untersuchung des Observer-Musters sollte klar sein, dass dieses Muster einen idealen Mechanismus bietet, um klare Grenzen zwischen Objekten in einer Anwendung sicherzustellen, unabhängig von ihrer Funktion (Benutzeroberfläche oder anderweitig).Obwohl die Implementierung über Rückrufe (mit den Schnittstellen IObserver und IObservable) relativ einfach ist, übernehmen die CLR-Konzepte von Delegaten und Ereignissen den Großteil der „schweren Arbeit“ und verringern den Grad der Kopplung zwischen Subjekt und Beobachter.

Nein, sie erreichen den gleichen Zweck, sind aber unterschiedlich.Ich würde sagen, dass das Observer-Muster ein ziemlicher Überentwurf ist, um etwas zu erreichen, das man mit funktionaler Programmierung leicht hätte erreichen können, und dass .NET-Ereignisse funktionale Programmierung verwenden, um dasselbe Ziel zu erreichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top