2009-04-30 11 views
13

Ich bin ein leitender Entwickler, aber ich hatte nicht viel formales Training und obwohl ich viele Design-Muster verwendet habe und sie in meinen Jahren als Entwickler verwendet habe, hat niemand wirklich etwas getan, um es zu sagen. "Oh, das ist ein Beobachtermuster, oder das ist ein Singleton-Muster."Wie unterscheidet sich das Observer-Muster von einem ereignisgesteuerten Modell?

Beim Lesen einiger Entwurfsmuster bin ich auf das Observer-Muster gestoßen und es scheint sehr ähnlich zu sein, wie die .NET-Framework-Ereignisse funktionieren. Fehle ich etwas Grundlegendes darüber?

Antwort

19

Das .NET-Ereignismodell ist eine integrierte Implementierung des Beobachtermusters in der Common Language Runtime. Die .NET-Sprachen implementieren Beobachter direkt in ihrer sprachspezifischen Art und Weise, wobei die dafür vorgesehene Unterstützung des Frameworks verwendet wird.

In den meisten Programmiersprachen erfordert das Beobachtermuster angepasste Entwicklung oder Bibliotheken.

Es ist kostenlos als Teil der Sprache in C#, VB.NET und den meisten anderen Sprachen für die Verwendung der CLR gebaut.

+4

.NET ist keine Sprache, .NET ist eine Laufzeitumgebung. –

+4

Wahr. Ich bezog mich auf die CLR, mehr als eine bestimmte Sprache, war aber in meinem Beitrag nicht spezifisch. Bearbeitet, um klarer zu sein. Danke für den Kommentar. –

1

Warum denken Sie, dass es einen Unterschied geben muss?

Denken Sie nicht, dass die .NET-Designer Design Patterns auch lesen?

Tatsächlich war das Observer-Muster (wie alle im Buch) bekannt, lange bevor sie kategorisiert und von der Gof4 benannt wurden. Es wurde verwendet, um das .Net-Ereignismodell sowie die Win32-Ereignismodelle Win32 & und wahrscheinlich viele andere zu implementieren.

+1

Ich habe nicht gesagt, dass es einen Unterschied geben muss. Ich habe gefragt, ob ich etwas verpasst habe.(-1 aggressive Nicht-Antwort) –

+1

Lol @ aggressive Nicht-Antwort – Janie

+0

Diese Antwort ist gut +1 – chikak

4

Viele Ereignismodelle, wie Java 1.1 und höher, sowie das .NET-Ereignismodell sind im Grunde Implementierungen des Observer-Musters.

Beachten Sie, dass dies auch für ältere Mechanismen gilt, z. B. die Verwendung von Rückrufmethoden in C für die Ereignisbehandlung. Es ist die gleiche Absicht, nur etwas anders umgesetzt.

6

Von MSDN

von Ihnen Diejenigen mit Vertrautheit vorbei der in der FCL ausgesetzt Typen werden beachten Sie, dass keine IObserver, IObservable, oder ObservableImpl Typen der Rahmen in vorhanden sind. Der Hauptgrund für ihre Abwesenheit ist die Tatsache, dass die CLR sie nach einer Mode obsolet macht. Obwohl Sie sicherlich diese Konstrukte in einer .NET-Anwendung verwenden können, die Einführung von Delegierten und Veranstaltungen stellt ein neues und wirksames Mittel die Beobachter-Muster Umsetzung ohne spezifische Typen Entwicklung gewidmet, dieses Muster zu unterstützen. In Tatsache, wie Delegierte und Ereignisse sind First-Class-Mitglieder der CLR, die Grundlage dieses Musters ist in den Kern des .NET Framework integriert. Als solche macht die FCL umfangreiche Verwendung des Observer-Muster in seiner gesamten Struktur.

+0

Schöne Theorie. Zu schade, dass sie einige wichtige Details ausgelassen haben (wie der Event-Publisher dem Abonnenten ein Token geben kann, mit dem er sich abmelden kann oder ein Mittel, mit dem der Publisher Abonnenten fragen kann, ob sie noch an ihren Abonnements "interessiert" sind Wenn viele Instanzen eines Objekts, das sich an das "Disposed" -Ereignis eines langlebigen Objekts anfügt, erstellt und aufgegeben werden, gibt es keine Möglichkeit, diese Subskriptionen während der Lebensdauer eines langlebigen Objekts zu bereinigen. Neben schwachen Ereignissen gab es keine Möglichkeit für den Herausgeber des Ereignisses .... – supercat

+0

... zu wissen, wann das Ziel außerhalb des Geltungsbereiches lag. Publisher-seitig schwach könnte ein wenig besser sein, aber nur effizient, wenn der Client es ist erforderlich, um einen starken Bezug zu seinem eigenen Delegierten zu halten (was bei Veranstaltungen normalerweise nicht erforderlich ist). – supercat

Verwandte Themen