Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Grundlagen der Programmierung: Entwurfsmuster

Beobachter: Das Problem

Testen Sie unsere 2015 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Ein Objekt informiert andere Objekte von seinen Zustandsänderungen, ganz ohne Einsatz eines Entwurfsmusters. Die Nachteile dieses Ansatzes enthüllt dieses Video.
06:53

Transkript

In diesem Video möchte ich Ihnen das Entwurfsmuster Beobachter vorstellen. Dazu schauen wir uns zuerst einmal an, welches Problem mit diesem Muster gelöst werden soll. Die Problemstellung lautet, wenn ein Objekt seinen Zustand ändert, dann sollen andere Objekte darüber informiert werden. Das lässt sich am besten an einem Beispiel erklären. In unserem Beispiel haben wir einen Temperatursensor. Dieser Sensor liefert regelmäßig aktuelle Temperaturdaten. Dann haben wir einen Heizung und eine Kühlung und die sollen entsprechend ein- und ausgeschaltet werden. Das heißt, wenn die Temperatur, die der Sensor liefert, einen gewissen Mindestwert unterschreitet, dann soll die Heizung aktiviert werden und wenn die Temperatur einen gewissen Höchstwert überschreitet, dann soll die Kühlung aktiviert werden. Diese Aufgabenstellung scheint recht geradlinig, wagen wir also gleich einen ersten Lösungsversuch. Hier haben wir unsere drei Objekte. Wir haben den Sensor. Wir haben die Heizung und wir haben die Kühlung. Damit der Sensor nun die Heizung und die Kühlung informieren kann, wenn die Temperatur sich geändert hat, muss er natürlich wissen, wo sich die befinden. Das heißt, der Sensor bekommt zwei Attribute, eines für die Heizung, eines für die Kühlung. Wenn sich nun die Temperatur ändert, dann geht der Sensor zu seinen beiden Attributen und ruft entsprechende Methoden von der Heizung und von der Kühlung auf. Die Methode in der Heizung, die hier aufgerufen werden soll, heißt hier geänderte Temperatur und bekommt die neue Temperatur übergeben und in dieser Methode prüft die Heizung nun also, ob diese Temperatur unter einem gewissen Schwellwert liegt und schaltete dann die Heizung ein, ansonsten wird ei Heizung ausgeschaltet. Danach geht der Sensor zur Kühlung. Informiert auch die Kühlung über diese neue Temperatur und die Kühlung schaut ebenfalls auf diesen neuen Temperaturwert. Vergleicht in diesem Fall, ob diese Temperatur über einem Maximalwert liegt und wenn ja, wir die Kühlung aktiviert, ansonsten wird sie deaktiviert. Das sieht soweit recht klar aus. Also werfen wir einfach einen Blick direkt auf den daraus resultierenden Quelltext. Dazu habe ich hier ein kleines Projekt vorbereitet mit unseren drei Klassen für Heizung, Kühlung und für den Temperatursensor. Werfen wir zuerst einen Blick auf die Heizung. Die Heizung hat zwei Attribute, eines für den Schwellwert, in diesem Fall also -10 Grad. Wenn die Temperatur unter -10 Grad sinkt, soll die Heizung aktiviert werden. Dann haben wir ein zweites Attribut, heitzungAn heißt das. Hier merken wir uns, ob die Heizung gerade an oder aus ist. Die Methode geaenderteTemperatur ist die Methode, die vom Sensor aufgerufen wird, wenn die Temperatur sich geändert hat und hier wird als Parameter die neue Temperatur übergeben. Die Heizung vergleicht dann diese neue Temperatur mit dem Schwellwert und schaltet sich dann entsprechend ein oder aus. Dafür haben wir hier die beiden Hilfsmethoden heizungEinschalten und heizungAusschalten, die für unsere Zwecke jetzt das Attribut auf true bzw. false setzen und eine entsprechende Statusmeldung ausgeben. Das ist also die Heizung. Die Kühlung sieht ähnlich aus. Hier haben wir auch wieder ein Attribut für die Schwelltemperatur, in diesem Fall 40 Grad. Also über 40 Grad soll die Kühlung angeworfen werden. Auch hier wieder die Methode geaenderteTemperatur, die die Kühlung entsprechend einschaltet oder ausschaltet und die beiden Hilfsmethoden, die das Attribut entsprechend setzen und die passende Statusmeldung ausgeben. Auch die Kühlung ist recht einfach aufgebaut. Der Dritte im Bunde ist unser Temperatursensor. Dieser hat natürlich zuerst einmal ein Attribut für die aktuelle Temperatur und dann zwei weiter Attribute, in denen sich der Sensor merken kann, wo die Heizung und die Kühlung sich befinden. Da der Sensor nicht selbst zuständig ist für die Erzeugung von Heizung und Kühlung, übergeben wir ihm hier im Konstruktor die Referenzen auf diese beiden Objekte, die sich der Sensor dann in seinen beiden Attributen merken kann. Mit der Methode setTemperatur können wir nun dem Sensor eine neue Temperatur mitteilen. Diese übernimmt er in sein internes Attribut. Dann gibt er uns eine kurze Statusmeldung, an der wir sehen können, dass der Sensor die neue Temperatur bekommen hat und danach geht der Sensor zur Heizung und zur Kühlung, ruft deren Methoden geaenderteTemperatur auf und übergibt diese neue Temperatur an diesen beiden Objekte. Um das Ganze ausprobieren zu können, habe ich hier noch eine vierte Klasse mit einer Main Methode und da wir momentan noch ohne das Entwurfsmuster Beobachter arbeiten, heißt die Klasse auch OhneBeobachterDemo. In der Main Methode werden jetzt ein Heizungsobjekt und ein Kühlungsobjekt erzeugt. Danach das Temperatursensorobjekt und hier im Konstruktor werden die beiden Werte übergeben für Heizung und Kühlung. Um das Ganze auszuprobieren, übergeben wir dem Sensor der Reihe nach einige Temperaturwerte und schauen, was passiert. Zuerst setzen wir die Temperatur auf 0. Da sollte erst mal gar nichts passieren. Die Heizung springt erst unterhalb von -10 Grad an und die Kühlung oberhalb von 40 Grad. Als nächstes setzen wir die Temperatur auf -20, dann sollte also die Heizung angehen. Die Heizung heizt bis wir bei +60 angekommen sind. Dann sollte die Heizung ausgehen und die Kühlung an. 60 ist größer als 40. Jetzt kühlt die Kühlung runter auf 20 Grad. Dann sollte die Kühlung ausgehen. Die Heizung ist von dieser Temperaturänderung nicht betroffen. Jetzt führen wir das Ganze aus und schauen, ob auch tatsächlich alles so funktioniert, wie wir uns das vorgestellt haben. Programm ausführen. Dann sehen wir, der Sensor meldet 0 Grad. Es passiert nichts. Dann meldet der Sensor -20 Grad. Die Heizung geht tatsächlich an. Der Sensor meldet 60 Grad, dann geht die Heizung aus und die Kühlung an und schließlich, wenn der Sensor 20 Grad meldet, dann wird die Kühlung auch wieder ausgeschaltet. Es funktioniert also alles, wie es soll und wir haben scheinbar unser Problem komplett ohne Entwurfsmuster gelöst. Diese Lösung hat allerdings einen Hake und zwar haben wir den Sensor direkt verdrahtet mit Heizung und Kühlung. Das mussten wir auch so machen, damit der Sensor diese beiden Objekte informieren kann, wenn er seinen internen Zustand ändert. Aber Sie kennen das vielleicht. Spätestens wenn das Programm fertig ist, gibt es eine Änderungsanforderung. In diesem Fall könnte die zum Beispiel so aussehen, dass es ein drittes Objekt geben soll, was sich ebenfalls dafür interessiert, wann die Temperatur sich ändert. Das könnte beispielsweise ein ganz simples Anzeigeobjekt sein, das uns einfach die aktuelle Temperatur anzeigt. Jedes Mal, wenn der Sensor eine neue Temperatur liefert, sollte diese Anzeige diese neue Temperatur anzeigen. Dafür würde es aber nicht genügen, wenn wir einfach die Anzeigeklasse unserem Projekt hinzufügen, sondern wir müssten auch den Sensor ändern. Wir müssten hier ein weiteres Attribut hinzufügen, damit der Sensor weiß, wo die Anzeige sich befindet. Wir müssten dem Konstruktor einen weiteren Parameter übergeben und wir müssten auch die setTemperatur Methode ändern. Wir müssten nämlich hier eine weitere Zeile hinzufügen, damit neben Heizung und Kühlung nun auch Anzeige von der geänderten Temperatur informiert werden. Obwohl der Sensor selbst eigentlich nichts weiter tun soll, als die Temperatur zu messen und weiterzugeben, müssten wir trotzdem jedes Mal, wenn wir einen neuen Interessenten hinzufügen wollen, auch diesen Sensor entsprechend ändern. Änderungen in einem Teil des Programms schlagen also auf einen anderen Teil durch, in diesem Fall dem Sensor, der damit eigentlich gar nichts zu tun haben sollte. Das heißt, unsere Lösung funktioniert zwar prinzipiell, sie ist allerdings recht unflexibel und Änderungen oder Erweiterungen bringen jedes Mal noch einen zusätzlichen Aufwand mit sich. Damit haben Sie nun also gesehen, wie die Problemstellung aussieht, die wir hier versuchen zu lösen und dass dieser erste Versuch nur recht unbefriedigend ist.

Grundlagen der Programmierung: Entwurfsmuster

Erhalten Sie einen fundierten Einstieg in das Thema Entwurfsmuster (Design Patterns) und erfahren Sie, wie Sie Entwurfsmuster in objektorientierten Programmiersprechen umsetzen.

2 Std. 49 min (33 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!