4

Ich habe darüber gelesen, wie man eine gute MVC in einem C++ Anwendung zu implementieren und kam im Grunde zu dem Punkt, dass es 2 Möglichkeiten, dies umzusetzen:C++ „bi-direktional“ Beobachter-Muster

  • Beobachter Muster
  • Signal/Slot

in beiden Fällen jedoch, die exemples ich alle eine Struktur folgen lesen, in dem das Thema wechseln kann und benachrichtigen sie Beobachter ist (s), aber der Beobachter ändert sich nie das Thema. Jetzt diese Fälle entstehen einige "Probleme".

Angenommen, ich habe eine Klasse namens Text (eine Modellkomponente), eine andere Klasse namens TextEditor (eine GUI-Komponente), die irgendwann 'Text' AND anzeigen kann und einige andere Klassen modifizieren kann ' Text 'auch.

Richtig, also verwende ich Beobachtermuster, mache 'Text' zum Thema und 'TextEditor' zum Beobachter. Keine große Sache.

Wenn Text in irgendeiner Weise geändert wird, ruft Text Text :: notify() auf und mein TextEditor spiegelt die Änderung wider. Fein.

Was nun, wenn ich den TextEditor verwende, um den Text zu ändern?

‚Texteditor‘ kennt ‚Text‘, so nennt es so etwas wie textInstance.setText (...) ... und am Ende des setText, ‚Text‘ Anrufe informieren und ‚Texteditor‘ wird mitgeteilt Eine Veränderung hat es sich selbst gemacht! 'Text' kann nicht einmal eine Nachricht an alle senden, außer 'TextEditor', weil es nicht von seinen Beobachtern wissen soll!

Ich habe das Gefühl, dass das nicht stimmt, nicht "sauber", auch aus Performance-Gründen asside. Ich würde wetten, es gibt einen besseren Weg, dies zu implementieren, aber ich stecke fest. Hat jemand Hinweise?

Ich bin nicht wirklich auf eine vorgefertigte C++ - Implementierung, aber mehr auf ein Verständnis, wie ich die Dinge richtig sehen sollte.

Antwort

4

Das Muster ist sauber. Sie machen jetzt die Annahme als TextEditor, was setText macht und müssen daher nicht benachrichtigt werden. Was ist, wenn der Text eingefroren wurde und sich nicht selbst ändern kann? Text kann auch eine Art Logger sein, der jeden neuen Text anfügt und Zeitstempel etc. hinzufügt.

Also, es ist vollkommen sauber für TextEditor, um Text zu "fragen", etwas zu tun und dann zu überprüfen, was das Ergebnis ist. Daher wird TextEditor nicht für eine Änderung benachrichtigt, die es selbst vorgenommen hat, sondern dafür, wie die angeforderte Änderung verwaltet wurde.

Wenn Sie wirklich Performance-Problem haben, was Sie auf unterschiedliche Weise tun können

  • entfernen Texteditor als Beobachter der Beobachter-Muster hacken, bevor sendtext Aufruf und readding es danach
  • , wenn alle der Anruf synchron sind: Prävention Texteditor der automatischen Aktualisierung durch ein Attribut Einstellung
  • etc ...
+0

Sehr klar explananation, danke – Dinaiz

Verwandte Themen