Ich habe eine Animationsklasse. Ich brauche einige Beobachter für Play
, Pause
und Stop
Ereignisse in der Animation. Ich habe 2 Lösungen für dieses Problem gefunden, aber ich weiß nicht, was ich wählen soll.Wie zu implementieren Observer-Muster in C++
Verwendung boost :: Signale oder etwas ähnliches und registrieren Rückrufe für jede Veranstaltung
Stellen Sie eine einfache Schnittstelle mit 3 rein virtuellen Funktionen (
OnPlay()
,OnPause()
,OnStop()
) und übergeben, um die Animation Klassenobjekte, dass Implementieren Sie diese Schnittstelle.
Es gibt Vor- und Nachteile für jede Methode. Ich werde versuchen, diejenigen aufzuzählen, die ich bisher gefunden:
Vorteile für 1.
- kann ich jede Memberfunktion/freie Funktion als Callback verwenden
- ich habe nicht alle 3-Funktionen zu implementieren, wenn ich über alle von ihnen
- gleiche Objekt aus Animation-Klasse ohne Durch zusätzliche Parameter für mehrere Animationen als Beobachter verwendet do not care
Nachteile für 1.
- muss ich für jeden Rückruf
- eine aufrufbare Objekt erstellen Wenn ich später ein neues Ereignis hinzufügen möchten wird es schwer sein, die Orte zu finden, wo es verwendet wurde (Compiler kann mich nicht zwingen, neues Ereignis zu implementieren oder zu ignorieren).
- Irgendwie seltsame Syntax (ich muss std :: bind/boost :: bind überall verwenden).
Vorteile für 2.
- Einfache Konstruktion
- zu verstehen, wenn ich ein neues Ereignis in Zeichentrick/Observer-Interface-Klasse hinzufügen, werden der Compiler erzwingen mich (leer vielleicht) zu implementieren die neue Funktion.
Nachteile für 2.
- Ich muss (leer vielleicht) implementieren 3 Funktionen, auch wenn ich werde nur ein
- gleiche Objekt kann nicht als Beobachter für verschiedene verwendet werden Animation ohne einige zusätzliche Parameter aus der Animation (ID oder etwas) zu senden.
- Kostenlose Funktionen können nicht verwendet werden.
Können Sie mir bitte beraten, was zu verwenden? Aus Ihrer Erfahrung, was ist besser für dieses Problem - die Freiheit von der ersten Approach oder klar und leicht zu verstehen Code aus der zweiten?Können Sie mir bitte andere Vorteile/Nachteile für beide Methoden oder andere Lösungen geben?
In C++ 11 (die ich nehme an, Sie verwenden können, da Sie die Frage mit ihm getaggt) lambdas entfernen die meisten der „Nachteile für 1 ". –
Wenn die Verwendung von 'std :: bind 'eine seltsame Syntax für Sie ist (besonders im Vergleich zu Interfaces mit virtuellen' OnWhatever'-Funktionen), sollten Sie lieber Ihre bevorzugte Sprache überdenken. –
@ChristianRau Nicht für mich, aber ich bin nicht der Einzige, der an der Codebasis arbeitet. – Felics