Der Observer-Modus, auch bekannt als Veröffentlichung/Abonnement (Publish/Abonnement) -Modus, definiert eine Eins-zu-Viele-Abhängigkeit, sodass mehrere Observer-Objekte gleichzeitig ein Themenobjekt anhören können. Dieses Objekt Objekt benachrichtigt alle Beobachterobjekte, wenn sich der Status ändert, sodass sie sich automatisch selbst aktualisieren können. Es gibt einen schlechten Nebeneffekt bei der Aufteilung eines Systems in eine Reihe von Kollaborationsklassen, was die Notwendigkeit ist, die Konsistenz zwischen verwandten Objekten aufrechtzuerhalten. Wir möchten nicht alle möglichen Dinge, um die Konsistenz aufrechtzuerhalten, streng zu vereinen, was zu Unannehmlichkeiten der Wartung, Expansion und Wiederverwendung führt. Was das Observer -Modell tut, ist tatsächlich zu entkoppeln, damit beide Parteien der Kopplung eher auf Abstraktion als auf Beton angewiesen sind.
Das Observer -Modell ist ein Modell, das in der Praxis häufig verwendet wird. Zu den Anwendungsszenarien gehören eine Fabrik, die Reis- und N -Händler produziert, die Reis verkaufen. N Händler registrieren zuerst ihre eigenen Kontaktinformationen in dieser Fabrik. Nachdem die Fabrik eine bestimmte Menge Reis erzeugt hat, werden die N -Händler die Ware gemäß den Kontaktinformationen informieren. In diesem Beispiel werden Registrierung (Anhang) und Benachrichtigung (Benachrichtigung) im Beobachtermodus verwendet, dh wenn sich der Status des Benachrichtigers ändert, wird jeder Beobachter wiederum benachrichtigt.
Das Subjekt ist ein abstrakter Benachrichtigungspunkt und Beobachter ist ein abstrakter Beobachter. Wenn die abgeleitete Klasse, die Sie erstellen, ein Objekt ist, mit dem Sie sich nicht beziehen, können Sie in Betracht ziehen, die Schnittstelle zu verwenden, um mehrere identische Methoden zu implementieren.
Der Java -Code lautet wie folgt:
Abstract Class Betreff {private arrayList <Beerverver> observerSlist = new ArrayList <Beervers> (); // Beobachter public void attd (Beobachter ob) {observerSlist.add (ob); } // Beobachter public void detach (Beobachter ob) {observerSlist.remove (ob); } public void benachificy () {für (Beobachter ob: observerSlist) {ob.update (); }}} Abstract Class Observer {public abstract void update ();} public class konkreteObserver erweitert Observer {private String -Name; private String Observerstatus; Privatbeton -Beton -Subjekt; public concreteObserver (ConcreteSubject Subjekt, String -Name) {this.subject = Subjekt; this.name = name; } public void update () {observerstatus = subjekt.getSubjectStatus (); }} public class Concretesubject erweitert das Thema {private String subjektstatus; public String ketsubjectStatus () {return subjektstatus; } public void setSubjectStatus (String subjektstatus) {this.subjectStatus = Subjektstatus; } public static void main (String [] args) {// Todo automatisch generierte Methode Stub ConcreteSubject s = new ConcreteSubject (); S.Attach (New ConcreteObserver (S, "X")); S.Attach (New ConcreteObserver (S, "Y")); S.ATTACH (New ConcreteObserver (S, "Z")); S.SetsubjectStatus ("Ready"); s.notify (); }}Im obigen Code gibt es abstrakte Beobachter und abstrakte Notifierer. Wenn sich der Status des Subjekts ändert, kann die Anruffunktion den darin registrierten Beobachter benachrichtigen. Diese Designidee ist auch im täglichen Leben üblich, wie die am Anfang erwähnten Reisproduzenten und Reisverkäufer. Ein weiteres Anwendungsszenario ist beispielsweise, wenn ein Buch im Buchladen nicht vorrätig ist und der Kunde es immer noch kaufen möchte, kann er sich registrieren. Nach der Ankunft der Ware ruft der Buchhandlungsinhaber an, um den Kunden zu benachrichtigen, der das Buch wiederum kaufen möchte. Dieser Registrierungsmechanismus spiegelt sich auch in anderen Programmierungstechniken wider. Ein Programm registriert beispielsweise mehrere Rückruffunktionen mit der zugrunde liegenden Bibliothek. Wenn die Bedingungen erfüllt sind, benachrichtigt die zugrunde liegende Bibliothek die von der obere Ebene bereitgestellte Rückruffunktion.
Der obige Code ist in Java geschrieben und ist in C ++ ähnlich. Es wird hauptsächlich ausgesetzt, um den Beobachterzeiger zu speichern. C ++ sollte jedoch das Problem des freien Speichers berücksichtigen. Beachten Sie, dass die Abnahmefunktion des Probanden beim Beobachter selbst aufgerufen werden muss. Andernfalls kann das Problem der Verwendung von Wildzeiger während des Updates zum Absturz führen. Erwägen Sie, den Lebenszyklus des Beobachters zu verwalten.