Einführung in Entwurfsmuster
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy — Lektion 89 von 110.
Design Patterns (Entwurfsmuster) sind bewährte Lösungen für häufige Probleme, auf die Entwickler beim Erstellen von Software immer wieder stoßen. Anstatt das Rad jedes Mal neu zu erfinden, können Sie diese etablierten Vorlagen anwenden, um ähnliche Herausforderungen auf eine konsistente und wartbare Weise zu lösen.
Betrachten Sie Entwurfsmuster als Rezepte. Genauso wie ein Koch nicht jedes Mal eine neue Art der Brotherstellung erfindet, verwenden Programmierer Muster, die über Jahrzehnte hinweg verfeinert wurden. Diese Muster nutzen die OOP-Konzepte, die Sie bereits gelernt haben – Klassen, Vererbung, Schnittstellen und Polymorphie – und kombinieren sie auf spezifische Weise, um bestimmte Probleme zu lösen.
Entwurfsmuster werden typischerweise in drei Kategorien unterteilt:
| Kategorie | Zweck | Beispiele |
|---|---|---|
| Erzeugungsmuster | Wie Objekte erstellt werden | Singleton, Factory |
| Strukturmuster | Wie Objekte zusammengesetzt werden | Adapter, Decorator |
| Verhaltensmuster | Wie Objekte kommunizieren | Observer, Strategy |
In den kommenden Lektionen werden Sie spezifische Muster aus jeder Kategorie kennenlernen. Jedes Muster adressiert ein bestimmtes Problem: sicherzustellen, dass nur eine Instanz einer Klasse existiert, Objekte zu erstellen, ohne genaue Klassen anzugeben, oder Objekten zu ermöglichen, andere über Änderungen zu benachrichtigen. Zu verstehen, wann und warum man jedes Muster verwendet, ist genauso wichtig wie zu wissen, wie man es implementiert.
Aufgabe
EinfachLassen Sie uns ein einfaches Problemlösungssystem bauen, das zeigt, wie Entwurfsmuster Code nach Kategorien organisieren! Sie werden eine Struktur erstellen, die verschiedene Software-Herausforderungen klassifiziert und vorschlägt, welcher Mustertyp bei deren Lösung helfen könnte.
Sie werden Ihren Code in zwei Dateien organisieren:
patterns.dart: Erstellen Sie ein Enum namensPatternCategorymit drei Werten:creational,structuralundbehavioral. Jeder Wert sollte einString descriptionFeld haben, das seinen Zweck erklärt:creational: "Handles object creation"structural: "Handles object composition"behavioral: "Handles object communication"
Problem, die eine Software-Herausforderung darstellt. Sie sollte einString nameFeld und einPatternCategory categoryFeld haben. Fügen Sie eine Methodesuggest()hinzu, die einen String im Format[name] -> Use a [category description] patternzurückgibt.main.dart: Importieren Sie Ihre patterns-Datei und demonstrieren Sie, wie verschiedene Probleme verschiedenen Musterkategorien zugeordnet werden. Erstellen Sie dreiProblemInstanzen:- Ein Problem namens
Ensure single database connectionmit der Kategoriecreational - Ein Problem namens
Make old API work with new systemmit der Kategoriestructural - Ein Problem namens
Notify users when data changesmit der Kategoriebehavioral
suggest()für jedes Problem auf und geben Sie die Ergebnisse aus.- Ein Problem namens
Diese Herausforderung hilft Ihnen zu verstehen, wie Entwurfsmuster nach der Art des Problems kategorisiert werden, das sie lösen – ein Schlüsselkonzept, während Sie in den kommenden Lektionen spezifische Muster kennenlernen!
Erwartete Ausgabe:
Ensure single database connection -> Use a Handles object creation pattern
Make old API work with new system -> Use a Handles object composition pattern
Notify users when data changes -> Use a Handles object communication patternSpickzettel
Design Patterns (Entwurfsmuster) sind bewährte Lösungen für häufig auftretende Programmierprobleme. Sie sind Vorlagen, die OOP-Konzepte (Klassen, Vererbung, Schnittstellen, Polymorphismus) auf spezifische Weise kombinieren.
Design Patterns werden in drei Kategorien unterteilt:
| Kategorie | Zweck | Beispiele |
|---|---|---|
| Erzeugungsmuster | Wie Objekte erstellt werden | Singleton, Factory |
| Strukturmuster | Wie Objekte zusammengesetzt werden | Adapter, Decorator |
| Verhaltensmuster | Wie Objekte kommunizieren | Observer, Strategy |
Probier es selbst
import 'patterns.dart';
void main() {
// TODO: Erstelle drei Problem-Instanzen:
// 1. name: "Ensure single database connection", category: creational
// 2. name: "Make old API work with new system", category: structural
// 3. name: "Notify users when data changes", category: behavioral
// TODO: Rufe suggest() für jedes Problem auf und gib die Ergebnisse aus
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas this-SchlüsselwortMethodenInstanzvariablenKonstruktor-GrundlagenWiederholung – Einfacher Taschenrechner4Null-Sicherheit
Einführung in Null-SicherheitNullable vs. Non-NullableDie ? und ! OperatorenLate-Schlüsselwort & Null-SicherheitNull-aware OperatorenNull-Sicherheit in KlassenZusammenfassung – Benutzerprofil-System7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrfache InterfacesRückblick – Shape Calculator10Collections & Generics
Überblick über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische ConstraintsIterable & IteratorZusammenfassung – Generische Speicherung13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungExtension MethodsCallable ClassesSealed Classes (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
Standard-KonstruktorBenannte KonstruktorenInitialisierungslistenKonstante KonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenZusammenfassung – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _ Präfix-KonventionSichtbarkeit auf Library-EbeneGetter & Setter im DetailInformation HidingRückblick – Schülerdatensätze8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas on-Schlüsselwort in MixinsMixin vs. VererbungMixin vs. InterfaceZusammenfassung - Tiersystem11Spezielle Methoden
toString() überschreibenhashCode & == überschreibenComparable-Interfacecall()-MethodenoSuchMethod überschreibenZusammenfassung – Eigene Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster3Klasseneigenschaften
Instanz- vs. statische MemberFinal & Const FelderLate-VariablenStatische Methoden & FelderGetter und SetterZusammenfassung – Bankkonto-Manager6Vererbung
Grundlagen der VererbungDas super-SchlüsselwortMethoden überschreibenDie @override-AnnotationDas final-Klassen-SchlüsselwortKonstruktoren & VererbungRückblick – Mitarbeiter-Hierarchie9Polymorphismus
Polymorphismus-GrundlagenPolymorphismus über InterfacesTypprüfung zur LaufzeitDie is & as OperatorenDas covariant SchlüsselwortZusammenfassung – Payment Processor