Einführung in Entwurfsmuster
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 70 von 91.
Entwurfsmuster sind bewährte Lösungen für häufig auftretende Probleme, mit denen Entwickler beim Erstellen von Software immer wieder konfrontiert werden. Anstatt jedes Mal das Rad neu zu erfinden, kannst du diese etablierten Vorlagen anwenden, um ähnliche Herausforderungen in deinem eigenen Code zu lösen.
Stell dir Designmuster als Rezepte vor. So wie ein Koch einem Rezept folgt, um ein Gericht zuzubereiten, das im Laufe der Zeit perfektioniert wurde, verwenden Entwickler Designmuster, um ihren Code auf eine Weise zu strukturieren, die bereits von unzähligen Programmierern vor ihnen getestet und verfeinert wurde.
Entwurfsmuster werden typischerweise in drei Kategorien eingeteilt:
| Kategorie | Zweck | Beispiele |
|---|---|---|
| Erzeugungsmuster | Wie Objekte erstellt werden | Singleton, Factory |
| Strukturmuster | Wie Objekte zusammengesetzt werden | Adapter, Decorator |
| Verhaltensmuster | Wie Objekte kommunizieren | Observer, Strategy |
Du hast in diesem Kurs tatsächlich Muster verwendet, ohne es zu merken. Als du abstrakte Klassen mit Methoden erstellt hast, die Kindklassen implementieren müssen, hast du eine Form des Template-Method-Musters angewendet. Als du Schnittstellen verwendet hast, um Verträge zu definieren, hast du die Grundlage für das Strategy-Muster geschaffen.
Das Erlernen von Entwurfsmustern gibt dir ein gemeinsames Vokabular mit anderen Entwicklern. Anstatt eine komplexe Struktur im Detail zu erklären, kannst du einfach sagen: „Ich habe hier das Factory-Muster verwendet“, und erfahrene Entwickler werden deinen Ansatz sofort verstehen. In den folgenden Lektionen werden wir mehrere wichtige Muster in PHP implementieren.
Aufgabe
EinfachErstellen wir ein einfaches System zur Nachrichtenformatierung, das zeigt, wie Entwurfsmuster dabei helfen, Code zu organisieren. Du wirst erkennen, welcher Kategorie von Entwurfsmustern die einzelnen Komponenten angehören, und sehen, wie verschiedene Teile eines Systems zusammenarbeiten.
Du wirst deinen Code auf drei Dateien verteilen:
MessageFormatter.php: Erstelle ein Interface namensMessageFormatter, das einen Vertrag für die Formatierung von Nachrichten definiert. Es sollte eine einzige Methodeformat(string $message): stringenthalten. Dies stellt die Verhaltenskategorie dar. Sie definiert, wie Objekte kommunizieren und Daten verarbeiten.Formatters.php: Binde die Datei MessageFormatter ein und erstelle zwei Klassen, die das Interface implementieren:UppercaseFormatter: Die Methodeformat()gibt die Nachricht in Großbuchstaben umgewandelt zurückBracketFormatter: Die Methodeformat()setzt die Nachricht in eckige Klammern, etwa[message]
main.php: Binde die Datei Formatters ein. Du erhältst zwei Eingaben: eine Nachrichtenzeichenkette und einen Formatierertyp ("upper"oder"bracket").Erstelle eine Funktion namens
processMessage, die einMessageFormatterund eine Nachrichtenzeichenkette akzeptiert und anschließend das formatierte Ergebnis zurückgibt. Diese Funktion muss nicht wissen, welchen konkreten Formatierer sie erhält. Sie ruft einfachformat()für das übergebene Objekt auf.Erstelle abhängig von der Eingabe des Formatierertyps das passende Formatiererobjekt. Übergib es zusammen mit der Nachricht an deine Funktion
processMessageund gib das Ergebnis aus.Gib in einer neuen Zeile aus, welche Kategorie von Entwurfsmustern diese Struktur darstellt. Da wir über ein Interface austauschbare Verhaltensweisen definieren, gib Folgendes aus:
Pattern category: Behavioral
Diese Aufgabe zeigt, wie Interfaces es dir ermöglichen, Implementierungen auszutauschen, ohne den Code zu ändern, der sie verwendet: eine Grundlage für Muster wie Strategy, die du in den kommenden Lektionen kennenlernen wirst.
Probier es selbst
<?php
require_once 'Formatters.php';
// Eingabe lesen
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: Erstelle eine Funktion namens processMessage, die einen MessageFormatter akzeptiert
// und einen message-String, dann das formatierte Ergebnis zurückgibt
// TODO: Basierend auf $formatterType ("upper" oder "bracket"), erstelle den entsprechenden Formatter
// TODO: Rufe processMessage mit dem Formatter und der Nachricht auf und gib dann das Ergebnis aus
// TODO: Print the pattern category on a new line
// Format: "Pattern category: Behavioral"
?>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 DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler