Beobachtermuster: Was ist dieses Entwurfsmuster?
Bei der Programmierung von Software müssen viele Aspekte berücksichtigt werden : Das Endprodukt muss beispielsweise nicht nur die gewünschten Funktionen haben, sondern sein Quellcode muss auch lesbar und verständlich sein . Um dies zu erreichen, muss natürlich der geringstmögliche Aufwand investiert werden, insbesondere wenn Programme oder Teile davon mit wiederkehrenden Funktionen oder Elementen entwickelt werden. Die sogenannten GoF-Muster (Gang of Four) bieten zu diesem Zweck eine Reihe vordefinierter Lösungen für verschiedene typische Probleme im Software- Design .
Wie andere beliebte Muster wie das Besuchermuster und das Singleton-Muster ist auch das sogenannte Observer-Muster Teil dieser Sammlung praktischer Entwurfsmuster, die Programmierern den Alltag so einfach machen . Wir erklären Ihnen, woraus das Observer-Muster besteht (einschließlich einer grafischen Darstellung in UML) und welche Vor- und Nachteile es bietet.
- Was ist das Beobachtermuster?
- Zweck und Funktionsweise des Observer-Musters
- Grafische Darstellung des Observer-Musters (UML-Diagramm)
- Was sind die Vor- und Nachteile des Observer-Musters?
- Wo gilt das Beobachtermuster?
- Beobachtermuster: Anwendungsbeispiel
Was ist das Beobachtermuster?
The Observer , Design , Muster, Observer – Muster oder Observer – Muster ist eines der beliebtesten Software – Entwurfsmuster . Dieses Tool bietet die Möglichkeit , eine Eins-zu-Eins- Abhängigkeit zwischen zwei oder mehr Objekten zu definieren , um alle Änderungen eines bestimmten Objekts auf einfachste und schnellste Weise zu übertragen. Um dies zu erreichen, ein anderes Objekt kann registriert auf einem (beobachteten) Objekt, das als Beobachter fungiert. Das erste Objekt, auch Subjekt genannt , informiert registrierte Beobachter bei jeder Änderung.
Wie bereits erwähnt, ist das Observer-Muster eines der GoF-Muster, die in dem 1994 erschienenen Buch Design Patterns: Elements of Reusable Object-Oriented Software enthalten sind . Die in dieser Veröffentlichung beschriebenen mehr als 20 Entwurfslösungen spielen auch heute noch eine wichtige Rolle bei der Konzeption und Entwicklung von Computeranwendungen.
Zweck und Funktionsweise des Observer-Musters
Das Observer-Muster funktioniert mit zwei Arten von Akteuren: einerseits dem Subjekt , dh dem Objekt, dessen Zustand langfristig überwacht werden soll. Auf der anderen Seite gibt es die Beobachtungsobjekte , die jede Änderung das Thema informiert werden müssen.
Im Allgemeinen sind einem Subjekt mehrere Beobachter zugeordnet, aber im Prinzip kann das Beobachtermuster auch mit einem einzelnen Beobachterobjekt angewendet werden.
Ohne das Beobachtermuster müssten Beobachterobjekte regelmäßig auf den Betreff angewendet werden und ihnen Aktualisierungen ihres Status senden ( Aktualisierungsstatus ). Jede dieser Anforderungen würde Rechenzeit in Anspruch nehmen und auch bestimmte Hardwareressourcen erfordern . Das Beobachtermuster basiert auf der Idee, die Aufgabe der Berichterstattung in den Händen des Subjekts zu zentralisieren. Um dies zu erreichen, gibt es eine Liste, auf der sich Beobachter registrieren können. Im Falle einer Änderung informiert das Subjekt sie nacheinander, ohne dass die Beobachter dies aktiv anfordern müssen. Wenn ein Beobachter später keine automatischen Updates mehr benötigt, kann er sich einfach von der Liste abmelden.
Es können zwei verschiedene Methoden angewendet werden, um jeden der Beobachter zu informieren. Bei der Push- Methode gibt der Betreff direkt in seiner Nachricht an, welche Änderungen aufgetreten sind. Diese Methode kann Probleme verursachen, wenn Informationen übertragen werden, die der Beobachter nicht verarbeiten kann. Die Pull- Methode hingegen stellt dieses Problem nicht dar: Damit überträgt das Subjekt nur die Informationen, dass Änderungen stattgefunden haben. Wenn Beobachter wissen wollen , was die Änderungen sind, haben sie den aktuellen Status mit einer speziellen Methode Aufruf zu beantragen.
Grafische Darstellung des Observer-Musters (UML-Diagramm)
Die Funktionsweise und Verwendung von Entwurfsmustern wie dem Beobachtermuster ist für diejenigen, die mit dem Thema nicht vertraut sind, oft schwer zu verstehen. Zum besseren Verständnis kann es hilfreich sein, eine grafische Darstellung des Entwurfsmusters zu betrachten . Die erweiterte Modellierungssprache UML (Unified Modeling Language) eignet sich besonders für diesen Zweck, da sie es ermöglicht, die Beziehungen sowohl für die Benutzer der Anwendung als auch für die Experten auf verständliche und intuitive Weise zu beschreiben. Aus diesem Grund haben wir UML als Modellierungssprache ausgewählt, um die folgende abstrakte Darstellung des Observer-Musters bereitzustellen.
Was sind die Vor- und Nachteile des Observer-Musters?
Das Observer-Muster kann die geeignete Lösung für viele Entwurfsprobleme sein. Sein größter Vorteil ist der hohe Grad an Unabhängigkeit zwischen dem beobachteten Objekt (Subjekt) und den Beobachtungsobjekten, die am aktuellen Zustand des Subjekts interessiert sind. Das beobachtete Objekt benötigt keinerlei Informationen über die Beobachter, da die Interaktion unabhängig über die Schnittstelle der Beobachter ausgeführt wird, die automatisch Aktualisierungen erhalten . Auf diese Weise werden die Anforderungen nicht mehr umsonst gemacht (wenn das Thema hat sich seit der letzten Anforderung nicht geändert wurde).
Automatische Aktualisierungen aller registrierten Beobachter durch das Subjekt sind jedoch nicht immer von Vorteil, da die übermittelten Änderungsinformationen für bestimmte Beobachter irrelevant sein können. Dieser Vorgang ist insbesondere dann unpraktisch, wenn die Anzahl der registrierten Beobachter sehr hoch ist, da viel Rechenzeit verschwendet wird. Ein weiterer Nachteil des Beobachtermusters besteht darin, dass der Quellcode des Probanden häufig nicht angibt, welche Beobachter gemeldet werden.
Wo gilt das Beobachtermuster?
Das Observer-Entwurfsmuster wird hauptsächlich in komponentenbasierten Anwendungen implementiert, deren Status,
- Einerseits wird es von anderen Komponenten stark beobachtet
- und andererseits wird es regelmäßig modifiziert .
Einige der typischen Anwendungen dieses Musters sind GUIs (grafische Benutzeroberflächen), die als handeln Kommunikationsschnittstelle einfach zwischen Benutzern und dem Programm zu verwenden. Jedes Mal, wenn Daten geändert werden, müssen sie in allen GUI-Komponenten aktualisiert werden. Diese Situation ist perfekt für die Anwendung der Subjekt-Beobachter-Struktur des Beobachtermusters. Selbst Programme, die mit Datensätzen im visuellen Format arbeiten (seien es klassische Tabellen oder grafische Diagramme), können von der Struktur dieses Entwurfsmusters profitieren.
Soweit die Programmiersprache betrifft , werden die Beobachter – Muster nicht tragen im Prinzip keiner besonderen Beschränkungen. Die einzige Voraussetzung ist, dass das objektorientierte Paradigma mit dem Muster kompatibel ist. Einige der am häufigsten verwendeten Sprachen zur Implementierung des Observer-Musters sind C #, C ++, Java, JavaScript, Python und PHP.
Beobachtermuster: Anwendungsbeispiel
Es können große Unterschiede bei der Umsetzung Modus des Beobachter – Muster verwendet , abhängig sein von der Programmiersprache. Das Grundkonzept der Implementierung ist jedoch immer dasselbe: Der Zugriff auf ein bestimmtes Objekt (oder seinen Status) wird vielen anderen Objekten zur Verfügung gestellt . Das Observer-Muster-Tutorial von javabeginners.de bietet ein sehr repräsentatives Beispiel dafür, was in der Praxis passiert, und kann sehr nützlich sein, um dieses Konzept zu verstehen.
Im Beispiel wollen wir einen Text von dem veröffentlichten zeigen Absender in den Textfeldern von mehreren Empfängern . Um dies zu tun, die subjectclass (e Misor vorbehaltlich ) fügt die addObserver () Methode zum observableclass . Somit können Rezeptoren hinzugefügt werden . Zusätzlich wird die setChanged () -Methode eingeführt , die Änderungen im Betreff registriert und bei Änderungen notifyObservers () aufruft , um alle Beobachter zu informieren.
class emisor extends Observable { public emisor(){ this.addObserver(new receptores_1()); this.addObserver(new receptores_2()); tell("Text"); } public void tell(String info){ if(countObservers()>0){ setChanged(); notifyObservers(info); } } }
Beobachter benötigen außerdem eine Implementierung der Beobachtungsschnittstelle, einschließlich der udpate () -Methode und zweier Argumente: das beobachtete Objekt und die Änderung der Form einer Objektinstanz ( ConcreteSubject ).
class receptores extends JFrame implements Observer{ private JTextField field; public receptores (){ field1 = new JTextField("a"); add(field); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 50); setVisible(true); } public void update(Observable o, Object arg) { field.setText((String) arg); } }