Einführung in Entwurfsmuster
Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 89 von 110.
Entwurfsmuster sind bewährte Lösungen für häufige Probleme, auf die Entwickler beim Erstellen von Software immer wieder stoßen. Statt das Rad jedes Mal neu zu erfinden, kannst du diese etablierten Vorlagen anwenden, um ähnliche Herausforderungen auf 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
EinfachLass uns ein einfaches Problemlösungssystem entwickeln, das veranschaulicht, wie Design Patterns Code nach Kategorien organisieren! Du wirst eine Struktur erstellen, die verschiedene Softwareherausforderungen klassifiziert und vorschlägt, welcher Pattern-Typ bei ihrer Lösung helfen könnte.
Du wirst deinen Code in zwei Dateien organisieren:
patterns.dart: Erstelle ein Enum namensPatternCategorymit drei Werten:creational,structuralundbehavioral. Jeder Wert sollte ein FeldString descriptionhaben, das seinen Zweck erklärt:creational: "Handles object creation"structural: "Handles object composition"behavioral: "Handles object communication"
Problem, die eine Softwareherausforderung repräsentiert. Sie sollte ein FeldString nameund ein FeldPatternCategory categoryhaben. Füge eine Methodesuggest()hinzu, die einen String im folgenden Format zurückgibt:[name] -> Use a [category description] patternmain.dart: Importiere deine Patterns-Datei und zeige, wie verschiedene Probleme verschiedenen Pattern-Kategorien zugeordnet werden. Erstelle drei Instanzen vonProblem:- 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()auf und gib die Ergebnisse aus.- Ein Problem namens
Diese Herausforderung hilft dir zu erkennen, wie Design Patterns nach der Art des Problems kategorisiert werden, das sie lösen – ein wichtiges Konzept, wenn du in den kommenden Lektionen beginnst, bestimmte Patterns zu lernen!
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 patternProbier 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 Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler