Schichtenarchitektur I
Du weißt nicht was es mit der sogenannten Schichtenarchitektur in der Informatik auf sich hat? Wir zeigen es dir in zwei Beiträgen!
Inhaltsübersicht
Modell zur Entkopplung von Klassen
Die Schichtenarchitektur besteht im Groben aus drei Schichten, die je nach Genauigkeit noch weiter untergliedert werden können.
Uns reicht hier aber die Aufgliederung in drei Schichten. Diese sind die GUI-Schicht, die Fachkonzeptschicht und die Datenhaltungsschicht.
Die GUI-Schicht enthält die Benutzeroberfläche inklusive Dialogführung. Sie stellt damit die Daten der Fachkonzeptschicht dar. Diese bildet den funktionalen Kern des Programms, denn sie manipuliert die fachlichen Daten. Darunter liegt die Datenhaltungsschicht, die die Datenspeicherung realisiert. Das heißt, sie sorgt für den Zugriff auf gespeicherte Daten.
Durch die Anwendung dieses Modells werden Klassen weniger abhängig voneinander. Das wird auch Entkopplung genannt. Diese Entkopplung kannst du erreichen, indem du die verschiedenen Klassen aufteilst und Schichten durch einzelne Pakete modulierst und implementierst.
Konkretisierung der Fachkonzeptschicht
Folgt man der strengen Schichtenarchitektur, so können Objekte einer Schicht nur auf Objekte der direkt darunterliegenden Schicht zugreifen, nicht aber anders herum. Um das ganze etwas besser zu verstehen, erklären wir dir die einzelnen Schichten jetzt genauer.
Beginnen wir mit der Fachkonzeptschicht. Sie dient im Allgemeinen der Verwaltung der fachlichen Daten. Dies erfolgt meist mittels Containerklassen. Containerklassen bestehen aus Objekten der zugehörigen Datenklasse, die über eine Komposition an den Container angebunden werden.
Das erstellte Containerobjekt besitzt wichtige Standardverwaltungsoperationen zum Hinzufügen und Löschen von Datenobjekten. Wir können aber auch mittels des sogenannten Iterator-Musters die Gesamtheit der in ihm enthaltenen Datenobjekte durchlaufen.
Wenn wir Objekte aus Datenklassen einer Containerklasse hinzufügen, werden deren Klassenattribute und -operationen zu den Objektattributen und -operationen der Containerklasse.
Dies ist allerdings für den konkreten Programmablauf nicht so wichtig, denn es wird nur ein Objekt der Containerklasse erzeugt. Das lässt sich mittels des sogenannten Singleton-Musters realisieren.
Singleton-Muster und Iterator-Muster
Das Singleton-Muster ist nichts weiter als ein Muster, das uns erlaubt, die Anzahl unserer erzeugten Objekte zu kontrollieren. Konkret müssen wir dafür unseren Konstruktor private deklarieren. Das klingt zwar erstmal sinnlos, aber nachher wird dir noch ein Licht aufgehen, warum.
Unsere Objekte verwalten wir nun durch ein Klassenattribut namens unique, auf das wir Zugriff über eine öffentliche Klassenoperation gewähren. Diese nennen wir instance().
Diese Funktion überprüft, wenn sie aufgerufen wird, ob bereits ein Objekt des Klassentyps vorhanden ist und ruft, wenn dies nicht der Fall ist, unseren Konstruktor auf. Dies ist nun möglich, da wir uns innerhalb derselben Klasse befinden.
Das andere Muster, das wir brauchen, ist das bereits erwähnte Iterator-Muster. Es erlaubt uns Objekte einer intern verwalteten Liste von außen zu durchlaufen. Das hat den Vorteil, dass der Zugriff einheitlich erfolgt und unabhängig von der internen Implementierung bleibt.
Damit das funktioniert muss unsere Liste durch eine beliebige API-Collection-Klasse implementiert sein. Dann bauen wir in unserer Klasse die Schnittstelle java.lang.Iterable ein.
Nun können wir uns mittels der Methode iterator() den Iterator für die interne Liste zurückgeben lassen. Diese Methode ist bereits für alle Collection-Klassen implementiert.
Aber wie durchlaufen wir jetzt alle Einträge? Dafür gibt es eine spezielle for-Schleife – und zwar die sogenannte for-each-Schleife.
Dabei steht Integer für den Typ der Listenelemente und a für die Klasse, die die Liste verwaltet oder in unserem Fall die Liste selbst.
Jetzt weißt du alles Wichtige zur Fachkonzeptschicht. Im nächsten Beitrag erklären wir dir noch die GUI- und die Datenhaltungsschicht.