Willkommen zu diesem Abschnitt über Entwurfsmuster. Diesen Abschnitt haben wir
vor allen Dingen für diejenigen aufgenommen, die SE2 nicht besucht haben.
Für die, die in SE2 waren, ist es eine Wiederholung.
Wir stellen kurz vor, was ist ein, woran es bei Entwurfsmustern geht.
Und wir sagen, stellen das Entwurfsmuster Beobachter vor.
Das geht los mit der allgemeinen Vorstellung oder der Definition.
Zunächst erst mal muss da diesen Begriff kennen sie.
Muster ist irgendetwas, was abstrakt ist.
Es abstrahiert von einer Form,
es wiederholt
Dinge, oder Dinge, die wiederholt, auftreten.
Und wir haben ein Entwurfsmuster, die nächste Zeit wird nochmal,
dass die Definition zeigen, als wiederverwendbarer,
wiederauftretende Lösung oder eine Lösung zu wiederauftreten, Problemen.
Diese Lösung ist allgemein im Sinne davon, dass Implementierung als
Konkretisierung nochmal davon nochmal Eigenschaften hinzufügt, speziellere Eigenschaften macht.
Deswegen, es gibt viele Möglichkeiten, ein Pattern zu implementieren,
weil das Pattern für sich ein Entwurfsmuster,
eine allgemeine Lösung darstellt
Ja, es gibt noch eine ganze Reihe verwandte Begriffe,
die entweder noch breiter sind,
sowie Heuristik oder Entwurfsprinzip oder aber auch konkreter sind, wiederverwendbarer Baustein,
wo die Lösung, die Implementation auch mit dabei ist.
Der ganze Begriff stammt aus der Architektur. Es gibt ein Buch von einem Architekten,
Christopher Alexander, der von Mustern beim Bau eines Hauses spricht,
die eigentlich sich erwiesen haben, dass die Menschen sich daran wohlfühlen, wiederkehrende Erkenntnisse, wiederkehrendes Wissen.
Es steckt also Entwurfswissen darin, solche Sachen wie,
man möchte, wenn man schläft,
im Schlafraum sollte man doch einen Blick zur Tür haben können,
damit man ruhiger schläft, weil man nicht das Gefühl hat,
da kommt jemand rein, ohne dass ich es merke.
Ein Raum sollte immer Tageslicht haben und am Arbeitsplatz irgendwie rechts.
Ich kenne diese Muster nicht wirklich, aber so sind ungefähr diese Entwurfsmuster.
Und er beschreibt bei den Entwurfsmustern geht es immer darum,
wie ein Problem aussieht und wie
die Lösung dazu ist
Diese Lösung beschreibt, wird durch das Muster im Wesentlichen im Kern beschrieben.
Das heißt nur das Essentielle, nur das,
was unbedingt notwendig ist, ist Teil der Musterbeschreibung.
Zusätzlich beschreibt er das Muster mit einer bestimmten Form, mit einem dreiteiligen Ausdruck,
der die Umgebung, die eigentliche Aufgabenstellung und die Lösung beschreibt.
An dieser Idee, dieses Autoren, dieses Architekten für Gebäude
lehnen wir uns an, wenn wir von Entwurfsmustern sprechen.
Entwurfsmuster folgen auch so einer strukturierten Beschreibung,
diese strukturierten Beschreibung hat mehr als drei Teile,
neben Namen Problem und Kontext und Lösung, das ist das,
was wir, was Christopher Alexander auch so hat,
haben wir noch die Auswirkungen auf die andere Umgebung.
Also was haben wir erreicht, Positives und was müssen wir in Kauf nehmen an negativen Dingen.
Dabei ist für uns besonders wichtig, auszudrücken,
worin besteht das Ziel, worin besteht die Motivation einer solchen Lösung,
wer wirkt alles mit, was sind die Teile,
Struktur heißt also, aus welchen Teilen besteht die Lösung,
was für Teile wirken da zusammen,
wie wirken die zusammen und was gibt es
für Regeln für die Implementierung
Und bei den Konsequenzen gibt es auch Vorbedingungen für die Anwendbarkeit,
die man beachten muss. Diese Entwurfsmuster haben ihre besondere Bedeutung
darin, dass sie wiederverwendbare, in Problemlösungen beschreiben.
Problemlösungen, die sich als gut erwiesen haben,
die im Sinne auch Bausteine sind, wobei die Bausteine abstrakt sind.
Der Vorteil von Abstrakt, Bausteinen sind, dass sie noch
Anpassbarkeit mit sich bringen. Sie haben also nicht so enge Vorbedingungen,
was die Programmiersprache, die Plattform oder so etwas entspricht,
aber man muss die Arbeit natürlich noch investieren für die Implementierung.
Doch dafür gibt es Empfehlungen. Auf jeden Fall handelt es
sich in gewisser Weise um Wiederverwendung,
auch wenn die Lösung nicht falls als solche lauffähig ist.
Ein weiterer wichtiger Vorteil ist, dass wir in der Vereinheitlichung haben.
Man hat etwas, was man wiedererkennen kann.
Ein bestimmtes Lösungsmuster erleichtert das Verständnis der Lösung,
weil ich Dinge habe, die ich wiederfinde.
Einarbeitung ist leichter, Verständnis ist leichter und es ist leichter,
etwas die Vielfalt zu beherrschen,
deswegen Komplexität,
die beherrschen
Erfahrene Entwickler kennen eine Größeranzahl von solchen Entwurfsmustern und
dann kann man das auch zum Austausch von Ideen müssen.
Ja, wir haben dieses Entwurfsmusterbeobachter,
das wirkt dort oder haben wir das Entwurfsmuster im VC,
das wirkt dort und so wirken die zusammen.
Damit kann man über solche Lösungen kommunizieren. Und hier ist es
ein bisschen runtergerutscht, PowerPoint macht auch nicht immer das,
was es soll. Wir haben damit auch eine höhere Qualität erreicht,
weil diese Lösungen haben schon ihre Qualität, ihre Eigenschaften bewiesen.
Sie haben bewiesen schon, dass sie bezüglich Änderbarkeit,
gute Eigenschaften haben oder Robustheit oder Skalierbarkeit oder Performance oder so etwas
Soweit zu den Muster, was es eigentlich ist,
was ihre Vorteile sind, auch vielleicht gleich zu den Fragen,
ja, also das über die Frage 10,
welche Nutzen hat das für Entwickler, das war die vorhergehende Folie.
Wie soll ich, wie empfehle ich Ihnen, damit umzugehen?
Wie sollten Sie sich solche Muster erarbeiten? Na,
am Ende genauso, wie man sich eine Programmiersprache erarbeitet,
dass man zunächst erst mal anfängt mit theoretischen Unterlagen, zum Beispiel das,
was wir in dieser Vorlesung und in der zugehörigen Übung mit Ihnen machen,
man sollte sich Bücher anschaffen, wo dieses Wissen zusammengefasst ist,
Man sollte die Angebote nehmen, die es online gibt,
Kataloge und so etwas.
Und dann sollte man versuchen, das anzuwenden. Auch das tun
wir in unserer Übung. Mein Sein kann sich Tutorials anschauen,
wo man das nachmacht, wo man das mitmacht. Und dann werden sie irgendwo,
und das ist dann der Schritt 3, in Projekten,
in Lösungen, werden sie auf solche Sachen stoßen,
wenn sie sehen, ah, so ist das angewandt.
Und das und das geht ja. Aber da ist noch ein bisschen,
weichen sie ein bisschen ab. Und das ist ja,
ach, das ist ja speziell, so sieht das konkret aus.
Ja, sie können sich dann, sie können das dann
verstehen, wie das Muster wirklich gemacht wird.
Und wenn sie eigene Erfahrungen sammeln, Erfahrungen,
wie man so sagt, passieren durch Schmerz und durch Fehler,
machen Sie dabei nicht so viele Fehler,
aber auf jeden Fall behält man diese Sachen am stärksten in Erinnerung.
Und das hilft Ihnen dann wirklich, dieses Entwurfsmuster zu Ihren,
Vokabular zu Ihrem Entwurfsvorrat zu machen. Zu diesen Katalogen,
von denen ich sprach, möchte ich Ihnen hier im Wesentlichen drei angeben,
das ursprüngliche Buch, wo erstmalig diese Entwurfsmuster beschrieben sind,
für die Informatik von den vier Autoren Gamma-Helm Johnson, Fliesides,
hier ist es im Bild dargestellt, ist schon relativ alt.
Es wird immer noch sehr gern zitiert,
enthält 40 grundlegende Muster. Ich bin der Meinung,
man sollte nicht nur das zitieren,
sondern die Nachfolgerwerke
auch noch
Insgesamt, Herr Buschmann,
hat insgesamt fünf Bände für verschiedene Zwecke mit verschiedenen Co-Autoren geschrieben.
Hier habe ich mal das für verteilte und vernetzte Systeme mitgenommen.
Das ist die Band 2 in dem Zeitraum 96 bis 2007,
also noch ein ganzes Stück jünger, als diese Musterkatalogie hier.
Und dann gibt es noch im Netz noch spezifische Kataloge.
Ich nehme als Beispiel hier etwas angegeben für.net oder für Sie
Sharp, JavaScript. Soweit allgemein und nun schauen wir uns
ein Entwurfsmuster im Detail an, und zwar das Entwurfsmusterbeobachtung.
Auf Englisch Observer
Dieses Berufe-Entwurfsmuster soll das Problem lösen,
dass zwei Elemente miteinander kommunizieren müssen, und zwar in einer Form,
dass B informiert werden muss über Änderungen von A,
auf diese Änderungen reagieren muss.
Normalerweise würde man das machen, indem man dort eine Nachricht
hinsendet und das übergibt, was dort zu übergeben ist.
Doch das stellt eine enge Kopplung dar. Enge Kopplung ist unerwünscht,
enge Kopplung hat er zur Folge,
dass bei jeder Änderung von A, ich beändern müsste,
beziehungsweise Veränderungen von B müsste ich A ändern.
Und das möchte man bei großen Systemen mit mehreren Millionen Elementen
Möchte man das so weit wie möglich verringern?
Deswegen ist das allgemeine Entwurfsprinzip, was wir haben, lose Kopplung.
Das wollen wir erreichen. Also wir wollen enge Kopplung vermeiden
. Änderungen sollen nicht zur Änderung des anderen Teils führen.
Wie sieht die Lösung dafür aus, die das Entwurfsmusterbeobachter uns vorschlägt?
Sie schlägt vor, dass B, dieser Teil,
der informiert werden soll, sich bei A anmeldet.
Und so wie ein Interessent, sie schreiben sich für einen
Newsletter ein und dann bekommen sie immer mal die Informationen,
wenn es da was Neues gibt.
Und diese Informationen, das habe ich jetzt hier in dem,
das ist ein kleines Sequenzdiagramm, haben wir ja gerade behandelt,
mit den mit in Lebenslinien von oben nach unten.
Also wir nehmen mal an, das Anmelden habe ich
jetzt hier nicht dargestellt, sondern nur das Informieren.
Und das würde so passieren, wenn eine Änderung passiert bei A,
dann informiert, das wird A, das B informieren.
Und das B holt sich dann selbst die Information, die es braucht.
Das führt dazu, dass wir wirklich außer dieser Sache,
ich informiere dich und dann kann ich dich fragen,
was es sich, gib mir mal das, was sich geändert hat.
Und dann suche ich mir selber raus, was ich davon brauche.
Das bedeutet, dass die zwei sehr unabhängig voneinander sein können.
Sie brauchen eigentlich nur ganz wenige Dinge, die miteinander abgestimmt
So, und wir gehen,
hier haben wir als von außen kommend die Änderung des Zustands,
also an A, ändert sich irgendetwas, dann aktualisiert,
er sendet, A, die Nachricht an B,
da hat sich was geändert.
Und B sagt dafür, okay, gib mir mal die Daten,
die Informationen, falls mich das überhaupt was angeht.
Es könnte natürlich auch sein, B tut nichts,
weil diese Änderung interessiert mich, interessiert sie nicht.
Und dann gib mir die Daten und mit den Daten mache ich
dann irgendetwas und aktualisiere zum Beispiel eine Darstellung oder irgendetwas.
Soweit ist das prinzipielle Lösung
Dass wir das Ganze möglichst gut wiederverwenden können, versuchen wir,
das Ganze, versuchen wir A und B hier nicht direkt zuzuverbinden,
sondern aus einem allgemeinen A und einem allgemeinen B nämlich abstrakte Oberklassen oder Interfaces das darzustellen.
Es sieht also insgesamt noch ein kleines bisschen anders aus.
Wir haben dieses A und das B, das B ist der Beobachter,
ist der, der informiert werden will und A ist das,
heißt hier Subjekt in diesem Entwurfsmuster,
im Namen sind immer ein bisschen schwierig zu wählen.
Also die Autoren haben sich da schon vier Gedanken gemacht,
welche Namen sie denn den Dingen geben,
also bei Beobachter ist relativ klar, das ist der,
der informiert werden möchte, der überwacht,
hat sich denn da was geändert und da,
wo sich was ändert,
das heißt hier Subjekt
Hier haben wir die Möglichkeit der Beobachter, also das ist zunächst
erst mal abstrakt im Sinne von Beobachter ist ein Interface.
Und dieses Subjekt ist eine abstrakte Klasse. Das heißt,
das konkrete Subjekt erbt von dieser abstrakten Klasse,
der konkrete Beobachter implementiert dieses Interface-Beobachter. So,
zunächst gibt es hier die Möglichkeit, dass sich der Beobachter hier anmeldet.
Dazu gibt es eine Liste, eine Methode, melde an,
melde ab und die werden in einer Liste geführt.
Hat zugleich den Vorteil,
dass mehrere Beobachter möglich sind
So, also der Beobachter meldet sich hier an und dann wird es so passieren,
wenn sich hier etwas ändert, ja,
zum Beispiel hier übersetzte Zustand, dann würde, würde der,
das konkreteste Objekt Benachrichtigung aussenden und zwar eine Benachrichtigung in aller Beobachter,
die in dieser Liste stehen.
Alle so ähnlich gehen wirklich wie eine Mailingliste. Alle,
die sich registriert haben, die bekommen eine Information, akkulialisiere dich,
ja, und dieses aktualisiere dich, sie sehen hier,
das steht nur bei der oberen Methode, die untere implementiert das.
Hier ist ja nicht keine Vererbung, hier ist es so,
alle, die hier oben stehen, sind hier unten geerbt und Dann kann,
wenn dieses aktuelle Internetmethode aktualisiere, steht dann drin,
ja, gib mir mal die Informationen, die du hast,
also über den Zustand gib Zustand.
Damit ist es völlig frei, was sich tatsächlich ändert.
Ja, wir müssen uns nicht darum kümmern,
wie viele Objekte geändert werden müssen von diesen Beobachtern,
was sich überhaupt alles angepasst hat.
Wir müssen nur sagen, okay, es hat sich was geändert,
schaut doch nach, ob dich das interessiert.
Ja, und dass wir, das passiert über das Benachrichtigen
bzw. über den sich den Zustand holen hier unter
Soweit erst mal, so sieht das Entwurfsmuster aus und ich
möchte zeigen an einem Beispiel, wie das konkret genutzt wird.
Ganz konkret wird das zum Beispiel angewendet bei Java für die User-Interface-Ereignisse. Diese User-Interface-Ereignisse nehmen wir mal hier,
ein Knopf wird gedrückt, das passiert mit milds einer,
mit des Events, die Events werden überwacht,
ob das eine Taste oder ein Touch-Ereignis oder ein Mausklick ist und Tastaturbetätigung,
ist erst mal egal und die werden überwacht von einem Event Listener.
Dieser Event Listener ist ein Interface, wir haben hier,
ich habe es, wenn sie mal mal wirklich die Klassen nachschauen,
während sie merken, es ist ein ganz kleines bisschen anders,
aber das Prinzip ist ja auch gut erklärbar.
Der Action-Listener macht das etwas konkreter und fragt das ab und ganz konkret,
also das ist eine abstrakte Klasse. Davon gibt es keine Exemplare,
aber von dem Button darf in dem Java-Button,
da gibt es Exemplare und diese ist Exemplar,
hat einen Zustand, das hat sich irgendetwas geändert und dann,
das ist durch außen passiert und man kann den Zustand abfragen,
das macht der Listener.
Also das, so wird es tatsächlich in Java verändert
, verwendet
Das ist auch diese Funktionsweise, die wir in der Frage elf gefragt haben,
wie wird die Entkopplung erreicht? Die Entkopplung wird dadurch erreicht,
dass wir wirklich nur diese beiden Methoden haben, aktualisiere.
Also achte, bitte holt dir die Aktualisierung ab,
es hat sich was geändert und gib mir die Informationen.
Mehr brauchen wir nicht abzustimmen. Die Möglichkeit mehrerer Beobachter,
das können wir uns hier dran anschauen. Wir sehen hier dieses Sternenvielfachheit bedeutet,
es gibt mehrere und das passiert so, mehrere dieser Beobachter,
indem wir hier nicht eine Variable haben vom Typ sondern eine Liste mit mehreren Elementen.
Beobachter, und die werden dann bei Benachrichtigungen, wird dann die ganze Liste durchgegangen,
alle kriegen die Informationen auf diese Weise, sind mehrere möglich.
So, es gab noch eine weitere Frage hier, wieso,
wie wird die Möglichkeit geschaffen, dass Beobachter unterschiedliche Informationen erhalten?
Na, indem sie einfach selbst entscheiden, was sie brauchen.
Sie kriegen nur die Informationen über den Fakt,
es hat sich was geändert und sie holen sich dann die Informationen hier ab,
zum Beispiel mit, gib Zustand oder etwas Ähnliches und dann entscheiden sie,
okay, ja, schön, dass ich es weiß,
aber es interessiert mich nicht oder ja,
ich aktualisiere mein Fenster oder ja,
ich führe jetzt sogar
eine Berechnung aus
Davon abhängig, was hier drinsteht. Und das wird innen
beim Ausführen der Methode akklusiere, gemacht.
Soweit dazu die Frage, welche Vorteile es bietet,
wenn wir dieses Entwurfsmuster zur Entkopplung einsetzen können, ist eben,
dass wir Aktualisierungen über mit loser Kopplung verbinden können.
So, damit sind wir auch schon am Ende dieses kleinen Einschubs.
Wie gesagt, für die, die SE2 hatten, hatten das.
Und machen Sie in der Übung lernen sie noch weitere Muster kennen,
mit denen sie sich dann etwas genauer beschäftigen.
Und wenn wir Glück haben,
wenn sie Glück haben und wenn sie das gut machen,
vielleicht behalten sie das ein oder andere Muster im Hinterkopf
und können es in ihrem nächsten Projekt einsetzen