Der Observer -Modus ist einer der Software -Designmodi und wird auch häufig verwendet, insbesondere bei der GUI -Programmierung. Es gibt viele Artikel über Designmuster im Internet, und viele Artikel sind gut geschrieben. Obwohl es den Verdacht hat, das frühe Rad zu wiederholen, ist dieses Rad nicht das andere Rad, mit unterschiedlichem Fokus, unterschiedlichen Ideen und unterschiedlichen Arten, es zu erzählen.
Schlüsselelemente
Thema:
Ein Thema ist das vom Beobachter beobachtete Objekt. Ein Thema muss die folgenden drei Merkmale haben.
Beobachter:
Wenn sich das Subjekt ändert, ist es ein Merkmal, den der Beobachter haben muss, wenn sich das Subjekt ändert.
Warum diesen Modus verwenden
Hier ist ein Beispiel, um zu veranschaulichen, dass die Milch zum Thema Milch Lieferung ist. Der Kunde des Milchabonnements ist der Monitor. Nachdem der Kunde die Milch von der Milk Lieferstation abonniert hat, erhält er jeden Tag die Milch. Wenn der Kunde nicht abonnieren möchte, kann er stornieren und in Zukunft keine Milch erhält.
Lose Kupplung
Der Beobachter fügt Code hinzu oder löscht, ohne das Thema zu ändern. Rufen Sie einfach die entsprechende Methode zum Hinzufügen oder Löschen des Themas an.
Das Subjekt ist nur für die Benachrichtigung des Beobachters verantwortlich, muss jedoch nicht wissen, wie der Beobachter mit der Benachrichtigung umgeht. Zum Beispiel ist die Milchversorgungsstation nur für die Lieferung von Milch verantwortlich und ist es egal, ob der Kunde sie trinkt oder sein Gesicht wäscht.
Der Beobachter muss nur auf die Themenmeldung warten, ohne die Details zum Thema zu beobachten. Das gleiche Beispiel müssen sich nur um die Milchlieferstation kümmern, um die Milch zu liefern, nicht darüber, welcher Kurier stammt oder aus welchem Transport die Milch zur Lieferung der Milch ist.
Java implementiert den Beobachtermodus
1. Javas eigene Implementierung
Klassendiagramm
/ ** * Das Beobachtungsziel erbt von java.util.observable * @author stone * */ public class updateObservable erweitert beobachtbar {private int data; public updateObservable (Beobachter Observer) {Addobserver (Beobachter); / * * andere Beobachter hinzufügen */} public int getData () {returndaten; } public void setData (int data) {if (data! = this.data) {this.data = data; setChanged (); // Tag -Änderungen, notifyObServers (); // Benachrichtigung}} @Override public synchronisierte void Addobserver (Beobachter o) {Super.AddobServer (o); } @Override public synchronisierte void DeleteObserver (Beobachter o) {Super.DeleteObServer (o); } @Override public void benachObServers () {Super.NotifyObServers (); } @Override public void mellifyObServers (Objekt arg) {super.notifyObServers (arg); } @Override public synchronisierte void DeleteObServers () {Super.DeleteObServers (); } @Override geschützte synchronisierte void setChanged () {Super.setchanged (); } @Override geschützte synchronisierte void conarchanged () {Super.Clearchanged (); } @Override public } @Override public synchronisierte int countObservers () {return Super.CountObServers (); }} / ** * Observer implementiert java.util.observer interface * @author stone * */ public class UpdateObServer implementiert Observer {@Override public void Update (Objekt, Objekt arg) {System.out.println ("Empfangen von Datenänderungen:"); if (o InstanceOF updateObservable) {UpdateObservable uo = (updateObservable) o; System.out.print ("Daten geändert in:" + uo.getData ()); }}} 2. benutzerdefiniertes Beobachtungsmodell
Klassendiagramm
/ ** * abstrakter Beobachter * Beobachtungs -Update * @Author Stone * */ öffentliche Schnittstelle IWatcher {/ * * Benachrichtigungsschnittstelle: * 1. Einfache Benachrichtigung * 2. Der Beobachter benötigt Daten über die Änderung des Ziels, sodass das Ziel als Parameter verwendet werden kann, siehe Javas Beobachtung und beobachtbares * // void update (iwatched beobachtete). void update (); } / ** * abstraktes Ziel -Subjekt * Bietet eine Schnittstelle zum Registrieren und Löschen von Observer -Objekten sowie eine Schnittstelle zur Beobachtung von Beobachtern * und die Schnittstelle, an die das Ziel beobachtet wird * @author stone * */ öffentliche Schnittstelle IWatchedSubject {public void add (iWatcher Watch); öffentliche Leere entfernen (iWatcher Watch); public void meldywathatchers (); public void update (); // Schnittstelle zu den beobachteten Geschäftsänderungen}} / ** * Spezifischer Beobachter konkreter Beobachter * * @author stone * * */ public class updateWatcher implementiert iWatcher {@Override public void update () {System.out.println (dieses + "beobachtet: Das Ziel wurde aktualisiert"); }} / ** * Spezifische Zielrolle konkretes Thema * @author stone * */ public class updatewatchedSubject implementiert iWatchedSubject {private list <IWatcher> Liste; public updateWatchedSubject () {this.list = new ArrayList <IWatcher> (); } @Override public void add (iWatcher watch) {this.list.add (watch); } @Override public void remove (iWatcher watch) {this.list.remove (watch); } @Override public void mellifyWatchers () {für (iWatcher Watcher: list) {watcher.update (); }} @Override public void update () {System.out.println ("Ziel -Update ......"); whathathatchers (); }} Ein Zuhörer ist eine Implementierung des Beobachters:
Klassendiagramm
/ ** * Hörer nach der Registrierung * @author stone * */ public interface ireGisterListener {void onregistriert (); }/ ** * Hörer Wenn sich der Benutzer in * @author stone anmelkt }
/** Hörer ist eine Implementierung des Beobachtermodus* Fügen Sie Hörer zu einigen Geschäftsschnittstellen hinzu, die zuzuhören müssen. Rufen Sie die entsprechenden Methoden des Hörers an, um das Hören zu implementieren. // nach Registrierungsregister.Onregistered (); } public void Login (IloGinListener Login) { / * * do ... Login * / system.out.println ("Registrierung ..."); // nach login.onlogined (); }} /*** Verhaltensmuster des Beobachtermodus* Der Beobachtermodus definiert eine Eins-zu-Viele-Abhängigkeit, sodass mehrere Observer-Objekte gleichzeitig ein Zielobjekt beobachten können. * Wenn sich dieses Zielobjekt in seinem Zustand ändert, informiert es alle Observer -Objekte, sodass sie sich automatisch selbst aktualisieren können. Das Zielobjekt benötigt eine Schnittstelle, um Beobachter hinzuzufügen, zu entfernen und zu benachrichtigen * * @Author Stone */ public class Test {public static void main (String [] args) {/ * * Verwenden Sie Javas eigenes Observer -Schnittstellen und Observable -Klasse */ updodObserable Observable = New UpdateObServable (New UpdateObserver ()); beobachtbar.setData (99); System.out.println (""); System.out.println (""); /** Benutzerdefiniertes Beobachtermodell*/ iWatchedSubject beobachtete = new UpdateWatchedSubject (); beobachtete.add (neuer UpdateWatcher ()); beobachtete.add (neuer UpdateWatcher ()); beobachtete.update (); System.out.println (""); /** Sub-Mode-Listener*/ user user = new user (); user.register (new ireGisterListener () {@Override public void onregistered () {System.out.println ("Nach Anhörung der Registrierung ...");}}); user.login (new iloGinListener () {@Override public void onlogined () {System.out.println ("Nach Anhörten von Login ...");}}); }}Empfangene Benachrichtigung über Datenänderungen: Daten geändert in: 99 Das Ziel wird aktualisiert ... observer.updatewatcher@457471e0 beobachtet: Das Ziel wurde aktualisiert. . . Anmelden ein Anmelden, nachdem Sie sich angelehnt haben. . .