Design Patterns mit Java: Eine Einführung

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Eine praxisnahe Beschreibung der Software Design Patterns, wie sie im 1994 erschienen Buch „Design Patterns – Elements of Reusable Object-Oriented Software“ der Autorengruppe Gamma, Helm, Johnson und Vlissides (auch genannt „Gang of Four“, kurz GoF, also „Viererbande“) Erwähnung finden.

Alle Muster werden anhand von Beispielen detailliert erläutert und auch kritisch gewürdigt. Darüber hinaus werden Entwurfsprinzipien der objektorientierten Programmierung beschrieben und berücksichtigt. 

Alle Beispiele sind ausführlich im Quellcode kommentiert und unter Java 16 lauffähig. Teilweise werden auch neuere Features von Java bis einschließlich Version 16 erläutert und verwendet.

Author(s): Olaf Musch
Edition: 1
Publisher: Springer Vieweg
Year: 2021

Language: German
Pages: 373
Tags: Java; Design Patterns; Object-Oriented Programming

Herzlich willkommen!
Inhaltsverzeichnis
1: Der Begriff „Entwurfsmuster“
1.1 Was sind Entwurfsmuster?
1.1.1 Geschichtlicher und gedanklicher Hintergrund
1.1.2 Vor- und Nachteile von Mustern
1.1.2.1 Muster transportieren und konservieren Wissen
1.1.2.2 Muster schaffen ein gemeinsames Vokabular
1.1.2.3 Muster helfen, eine Programmiersprache besser zu verstehen
1.1.2.4 Muster können zu unangemessenen Entwürfen verleiten
1.1.3 Ein Muster ist kein Code ist kein Muster
Was also sind „Entwurfsmuster“?
1.1.4 Muster in der Praxis
1.2 Entwurfsmuster kategorisieren und beschreiben
1.2.1 Verschiedene Kategorien von Mustern
1.2.2 Ein Muster-Template definieren
1.3 Zusammenfassung
2: Objektorientierte Programmierung und Entwurfsprinzipien
2.1 Objektorientierte Programmierung
2.2 Gegen Schnittstellen programmieren
2.3 Single Responsibility Principle (SRP)
2.4 Inheritance may be evil
2.5 Open/Closed Principle (OCP)
2.6 Prinzip des rechten Augenmaßes
3: Singleton
3.1 Die Aufgabe des Singleton Patterns
3.2 Eine erste Version des Singletons
3.3 Den Zugriff synchronisieren
3.4 Double checked locking
3.5 Early instantiation – frühes Laden
3.6 Singleton – Das UML-Diagramm
3.7 Antipattern
3.7.1 Kritik am Singleton
3.7.2 Ist Singleton ein Antipattern?
3.8 Zusammenfassung
Zweckbeschreibung
4: Template Method
4.1 Die Arbeitsweise von Template Method
4.1.1 Ein erster Ansatz
4.1.2 Der zweite Ansatz
4.1.3 Das Hollywood-Prinzip
4.1.4 Einführen von Hook-Methoden
4.2 Das Interface „ListModel“
4.3 Template Method – Das UML-Diagramm
4.4 Zusammenfassung
Zweckbeschreibung
5: Observer
5.1 Einleitung
5.2 Eine erste Realisierung
5.3 Den Ansatz erweitern
5.4 Observer in der Java Klassenbibliothek
5.5 Nebenläufiger Zugriff
5.5.1 Zugriffe synchronisieren
5.5.2 Die Datenbasis kopieren
5.5.3 Einsatz einer threadsicheren Liste
5.6 Observer als Listener
5.7 Listener in der GUI-Programmierung
5.8 Das Model-View-Controller Pattern
5.9 Observer – Das UML-Diagramm
5.10 Zusammenfassung
Zweckbeschreibung
6: Chain of Responsibility
6.1 Ein Beispiel aus der realen Welt
6.2 Erstes Code-Beispiel: Lebensmitteleinkauf
6.2.1 Die benötigten Lebensmittel
6.2.2 Die Verkäufer
6.2.3 Der Client
6.2.3.1 Erweiterung des Projekts
6.2.3.2 Variationen des Patterns
6.2.3.2.1 Hierarchien gestalten und beliebigen Einstiegspunkt wählen
6.2.3.2.2 Glieder der Kette modifizieren die Anfrage
6.3 Ein Beispiel aus der Klassenbibliothek
6.4 Chain of Responsibility – Das UML-Diagramm
6.5 Zusammenfassung
Zweckbeschreibung
7: Mediator
7.1 Abgrenzung zum Observer Pattern
7.2 Aufgabe des Mediator Patterns
7.3 Mediator in Aktion – ein Beispiel
7.3.1 Definition eines Consumers
7.3.2 Definition eines Producers
7.3.3 Interface des Mediators
7.3.4 Test des Mediator Patterns
7.4 Mediator in Aktion – das zweite Beispiel
7.4.1 Mediator in der GUI-Programmierung
7.4.2 Aufbau der GUI
7.5 Mediator – Das UML-Diagramm
7.6 Kritik an Mediator
7.7 Zusammenfassung
Zweckbeschreibung
8: State
8.1 Exkurs: Das Enum Pattern
8.1.1 Einen Zustand durch Zahlenwerte darstellen
8.1.2 Einen Zustand durch Objekte darstellen
8.1.3 Umsetzung in der Java-Klassenbibliothek
8.2 Den Zustand eines Objekts ändern
8.2.1 Ein erster Ansatz
8.2.2 Ein zweiter Ansatz
8.3 Das Prinzip des State Pattern
8.3.1 Die Rolle aller Zustände definieren
8.3.2 Das Projekt aus der Sicht des Clients
8.3.3 Veränderungen des Projekts
8.3.3.1 State-Objekte zentral im Kontext verwalten
8.3.3.2 State-Objekte als Rückgabewerte von Methodenaufrufen
8.4 Das State Pattern in der Praxis
8.5 State – Das UML-Diagramm
8.6 Zusammenfassung
Zweckbeschreibung
9: Command
9.1 Befehle in Klassen kapseln
9.1.1 Version 1 – Grundversion
9.1.2 Weitere Anbieter treten auf
9.1.3 Einen Befehl kapseln
9.2 Command in der Klassenbibliothek
9.2.1 Beispiel 1: Nebenläufigkeit
9.2.2 Beispiel 2: Event-Handling
9.3 Befehlsobjekte wiederverwenden
9.3.1 Das Interface „Action“
9.3.2 Verwendung des Interface „Action“
9.4 Undo und redo von Befehlen
9.4.1 Ein einfaches Beispiel
9.4.2 Ein umfangreicheres Beispiel
9.4.3 Besprechung des Quelltextes
9.4.3.1 Die beteiligten Klassen
9.4.3.2 Aufgabe der GUI
9.4.3.3 Arbeitsweise der Command-Klassen
9.4.3.4 Undo und redo
9.4.4 Undo und redo grundsätzlich betrachtet
9.5 Command – Das UML-Diagramm
9.6 Zusammenfassung
Zweckbeschreibung
10: Strategy
10.1 Ein erster Ansatz
10.2 Strategy in Aktion – Sortieralgorithmen
10.2.1 Das gemeinsame Interface
10.2.2 Der Selection Sort
10.2.3 Der Merge Sort
10.2.4 Der Quick Sort
10.2.5 Der Kontext
10.2.6 Bewertung des Ansatzes und mögliche Variationen
10.3 Das Strategy Pattern in der Praxis
10.4 Strategy – Das UML-Diagramm
10.5 Abgrenzung zu anderen Mustern
10.6 Zusammenfassung
Zweckbeschreibung
11: Iterator
11.1 Zwei Möglichkeiten, Daten zu speichern
11.1.1 Daten in einem Array speichern
11.1.2 Daten in einer Kette speichern
11.2 Die Aufgabe eines Iterators
11.3 Das Interface Iterator in Java
11.3.1 Der Iterator der Klasse MyArray
11.3.1.1 Test des Iterators
11.3.1.2 Nutzen und Varianten des Iterators
11.3.2 Der Iterator der Klasse MyList
11.3.2.1 Test des Iterators
11.3.2.2 Nutzen des Iterators
11.4 Das Interface Iterable
11.5 Iterator – Das UML-Diagramm
11.6 Zusammenfassung
Zweckbeschreibung
12: Composite
12.1 Prinzip von Composite
12.2 Umsetzung 1: Sicherheit
12.3 Umsetzung 2: Transparenz
12.4 Betrachtung der beiden Ansätze
12.5 Einen Schritt weiter gehen
12.5.1 Einen Cache anlegen
12.5.2 Die Elternkomponenten referenzieren
12.5.3 Knoten verschieben
12.6 Composite – Das UML-Diagramm
12.7 Zusammenfassung
Zweckbeschreibung
13: Flyweight
13.1 Aufgabe des Patterns
13.2 Die Realisierung
13.3 Ein komplexeres Projekt
13.3.1 Der erste Ansatz
13.3.2 Intrinsischer und extrinsischer Zustand
13.4 Flyweight in der Praxis
13.5 Flyweight – Das UML-Diagramm
13.6 Zusammenfassung
Zweckbeschreibung
14: Interpreter
14.1 Die Aufgabe in diesem Kapitel
14.2 Der Scanner
14.2.1 Die definierten Symbole
14.2.2 Der Scanner wandelt Strings in Symbole um
14.3 Der Parser
14.3.1 Abstrakte Syntaxbäume
14.3.2 Expressions für den Parser
14.3.3 Strichrechnung parsen
14.3.4 Punktrechnung parsen
14.3.5 Klammern berücksichtigen
14.4 Interpreter – Das UML-Diagramm
14.5 Diskussion des Interpreter Patterns
14.6 Zusammenfassung
Zweckbeschreibung
15: Abstrakte Fabrik (Abstract Factory)
15.1 Gärten anlegen
15.1.1 Der erste Versuch
15.1.2 Der zweite Versuch – Vererbung
15.1.3 Der dritte Ansatz – die abstrakte Fabrik
15.1.4 Vorteile der abstrakten Fabrik
15.1.5 Einen neuen Garten definieren
15.2 Diskussion des Patterns und Praxis
15.3 Gespenster jagen
15.3.1 Die erste Version
15.3.1.1 Der Spieler
15.3.1.2 Die vier Himmelsrichtungen
15.3.1.3 Das Haus bauen
15.3.1.4 Die Klasse „Haus“ zur Steuerung des Spiels
15.3.2 Die zweite Version des Projekts
15.3.3 Version 3 – Einführung einer weiteren Fabrik
15.3.3.1 Zaubersprüche
15.3.3.2 Die neue Fabrik für Türen mit Zauberspruch
15.3.3.3 Das neue Bauteil: Eine Tür mit Zauberspruch
15.3.4 Version 4 – das Geisterhaus
15.4 Abstract Factory – Das UML-Diagramm
15.5 Zusammenfassung
Zweckbeschreibung
16: Factory Method
16.1 Ein erstes Beispiel
16.2 Variationen des Beispiels
16.3 Praktische Anwendung des Patterns
16.3.1 Rückgriff auf das Iterator Pattern
16.3.2 Bei der Abstract Factory
16.4 Ein größeres Beispiel – ein Framework
16.4.1 Und noch ein Kalender
16.4.2 Die Schnittstellen für Einträge und deren Editoren
16.4.3 Die Klasse „Kontakt“ als Beispiel für einen Eintrag
16.4.4 Die Klasse FactoryMethod als Client
16.5 Unterschied zur Abstract Factory
16.6 Factory Method – Das UML-Diagramm
16.7 Zusammenfassung
Zweckbeschreibung
17: Prototype
17.1 Objekte klonen
17.1.1 Kritik an der Realisierung
17.1.1.1 Das Interface Cloneable
17.1.1.2 Das Problem gleicher Referenzen
17.1.1.3 Was passiert beim Klonen
17.1.2 In Vererbungshierarchien klonen
17.2 Ein größeres Projekt
17.2.1 Besprechung der ersten Version
17.2.2 Die zweite Version – deep copy
17.2.3 Eigene Prototype definieren
17.3 Prototype – Das UML-Diagramm
17.4 Zusammenfassung
Zweckbeschreibung
18: Builder
18.1 Ein Objekt erzeugt andere Objekte
18.1.1 Telescoping Constructor Pattern
18.1.2 JavaBeans Pattern
18.1.3 Builder Pattern
18.2 Ein komplexerer Konstruktionsprozess
18.2.1 XML-Dateien in ein TreeModel konvertieren
18.2.2 XML-Dateien als HTML darstellen
18.3 Builder – Das UML-Diagramm
18.4 Zusammenfassung
Zweckbeschreibung
19: Visitor
19.1 Ein einfaches Beispiel
19.1.1 Das Aggregat
19.1.2 Der Visitor
19.1.3 Der Client
19.1.4 Ein weiterer Visitor
19.1.5 Kritik am Projekt
19.2 Visitor – Das UML-Diagramm
19.3 Zusammenfassung
Zweckbeschreibung
20: Memento
20.1 Aufgabe des Memento Patterns
20.1.1 Öffentliche Datenfelder
20.1.2 Das JavaBeans Pattern
20.1.3 Default-Sichtbarkeit
20.2 Eine mögliche Realisierung
20.3 Ein größeres Projekt
20.4 Memento – Das UML-Diagramm
20.5 Zusammenfassung
Zweckbeschreibung
21: Fassade
21.1 Ein Beispiel außerhalb der IT
21.2 Die Fassade in einem Java-Beispiel
21.2.1 Einführung einer Fassade
21.2.2 Der Begriff „System“ genauer betrachtet
21.3 Die Fassade in der Klassenbibliothek
21.4 Das „Gesetz von Demeter“
21.5 Fassade – Das UML-Diagramm
21.6 Zusammenfassung
Zweckbeschreibung
22: Adapter
22.1 Ein einleitendes Beispiel
22.2 Ein klassenbasierter Entwurf
22.3 Ein objektbasierter Entwurf
22.4 Kritik am Adapter Pattern
22.5 Ein Etikettenschwindel
22.6 Adapter – Das UML-Diagramm
22.7 Zusammenfassung
Zweckbeschreibung
23: Proxy
23.1 Virtual Proxy
23.2 Security Proxy
23.3 Smart Reference
23.3.1 Die Grundversion
23.3.2 Einführung eines Proxys
23.3.3 Einen zweiten Proxy einführen
23.3.4 Dynamic Proxy
23.3.4.1 Das Reflection API
23.3.4.2 Der InvocationHandler
23.3.4.3 Die Proxy-Klasse
23.4 Remote Proxy
23.4.1 Aufbau von RMI grundsätzlich
23.4.2 Der RMI-Server
23.4.2.1 Die Schnittstelle PiIF
23.4.2.2 Die Serverklasse PiImpl
23.4.2.3 Die Klasse ServerStart startet den Server
23.4.3 Der RMI-Client
23.4.4 Das Projekt zum Laufen bringen
23.5 Proxy – Das UML-Diagramm
23.6 Zusammenfassung
Zweckbeschreibung
24: Decorator
24.1 Autos bauen
24.1.1 Ein Attribut für jede Sonderausstattung
24.1.2 Mit Vererbung erweitern
24.1.3 Dekorieren nach dem Matroschka-Prinzip
24.1.3.1 Definieren der Grundmodelle
24.1.3.2 Definieren der Sonderausstattungen
24.1.3.3 Der Client steckt die Komponenten zusammen
24.2 Praxisbeispiele
24.2.1 Die Klasse „JScrollPane“
24.2.2 Streams in Java
24.2.2.1 Streams als Decorator
24.2.2.2 Streams als Non-Decorator
24.3 Decorator – Das UML-Diagramm
24.4 Zusammenfassung
Zweckbeschreibung
25: Bridge
25.1 Zwei Definitionen
25.1.1 Was ist eine Abstraktion
25.1.2 Was ist eine Implementierung
25.1.3 Ein Problem beginnt zu reifen
25.2 Das Bridge Pattern im Einsatz
25.2.1 Erster Schritt
25.2.2 Zweiter Schritt
25.2.2.1 Die Abstraktion erweitern
25.2.2.2 Die Implementierung erweitern
25.3 Diskussion des Bridge Patterns
25.3.1 Die Bridge in freier Wildbahn
25.3.2 Abgrenzung zu anderen Patterns
25.4 Bridge – Das UML-Diagramm
25.5 Zusammenfassung
Zweckbeschreibung
26: Muster kombinieren
26.1 Das Beispiel
26.2 Singleton: Protokollierung
26.3 Abstrakte Fabrik: Bau der Sensoren
26.4 Observer: Die Auslösung
26.5 Adapter: Benachrichtigungen verschicken
26.6 Command: Aktoren und Fernbedienung
26.7 Ein Sensor löst aus
26.8 Klassendiagramm
26.9 Der Client
26.10 Überlegungen
26.11 Zusammenfassung
Schlussbemerkungen
Stichwortverzeichnis