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ä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 bewährten Vorlagen anwenden, um ähnliche Herausforderungen in Ihrem eigenen Code zu lösen.
Stellen Sie sich Entwurfsmuster wie Rezepte vor. Genauso wie ein Koch einem Rezept folgt, um ein Gericht zu kreieren, das im Laufe der Zeit perfektioniert wurde, verwenden Entwickler Entwurfsmuster, um ihren Code auf eine Weise zu strukturieren, die von unzähligen Programmierern vor ihnen getestet und verfeinert wurde.
Entwurfsmuster werden üblicherweise 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 |
Sie haben im Laufe dieses Kurses tatsächlich Muster verwendet, ohne es zu merken. Als Sie abstrakte Klassen mit Methoden erstellt haben, die Kindklassen implementieren müssen, haben Sie eine Form des Template Method-Musters angewendet. Als Sie Interfaces verwendet haben, um Verträge zu definieren, haben Sie die Grundlage für das Strategy-Muster geschaffen.
Das Erlernen von Entwurfsmustern bietet Ihnen ein gemeinsames Vokabular mit anderen Entwicklern. Anstatt eine komplexe Struktur im Detail zu erklären, können Sie einfach sagen: „Ich habe hier das Factory-Pattern verwendet“, und erfahrene Entwickler werden Ihren Ansatz sofort verstehen. In den folgenden Lektionen werden wir mehrere essenzielle Muster in PHP implementieren.
Aufgabe
EinfachLassen Sie uns ein einfaches System zur Nachrichtenformatierung erstellen, das zeigt, wie Entwurfsmuster helfen, Code zu organisieren. Sie werden identifizieren, zu welcher Musterkategorie jede Komponente gehört, und sehen, wie verschiedene Teile eines Systems zusammenarbeiten.
Sie werden Ihren Code über drei Dateien hinweg organisieren:
MessageFormatter.php— Erstellen Sie ein Interface namensMessageFormatter, das einen Vertrag für die Formatierung von Nachrichten definiert. Es sollte eine einzige Methodeformat(string $message): stringhaben. Dies repräsentiert die Kategorie behavioral (Verhaltensmuster) — sie definiert, wie Objekte kommunizieren und Daten verarbeiten.Formatters.php— Binden Sie die Datei MessageFormatter ein und erstellen Sie zwei Klassen, die das Interface implementieren:UppercaseFormatter— Seine Methodeformat()gibt die Nachricht in Großbuchstaben umgewandelt zurück.BracketFormatter— Seine Methodeformat()umschließt die Nachricht mit eckigen Klammern wie[message].
main.php— Binden Sie die Datei Formatters ein. Sie erhalten zwei Eingaben: einen Nachrichten-String und einen Formatter-Typ ("upper"oder"bracket").Erstellen Sie eine Funktion namens
processMessage, die einenMessageFormatterund einen Nachrichten-String akzeptiert und dann das formatierte Ergebnis zurückgibt. Diese Funktion muss nicht wissen, welchen spezifischen Formatter sie erhält — sie ruft einfachformat()für das übergebene Objekt auf.Erstellen Sie basierend auf der Eingabe des Formatter-Typs das entsprechende Formatter-Objekt. Übergeben Sie es zusammen mit der Nachricht an Ihre Funktion
processMessageund geben Sie das Ergebnis aus.Geben Sie in einer neuen Zeile aus, welche Musterkategorie diese Struktur repräsentiert. Da wir austauschbare Verhaltensweisen über ein Interface definieren, geben Sie aus:
Pattern category: Behavioral
Diese Herausforderung zeigt, wie Interfaces es ermöglichen, Implementierungen auszutauschen, ohne den Code zu ändern, der sie verwendet — eine Grundlage für Muster wie Strategy, die Sie in den kommenden Lektionen erkunden werden.
Spickzettel
Entwurfsmuster sind bewährte Lösungen für gängige Programmierprobleme, die Vorlagen für die effektive Strukturierung von Code bieten.
Entwurfsmuster 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 |
Entwurfsmuster bieten ein gemeinsames Vokabular unter Entwicklern, was die Kommunikation über komplexe Architektur-Entscheidungen erleichtert.
Probier es selbst
<?php
require_once 'Formatters.php';
// Eingabe lesen
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: Erstellen Sie eine Funktion namens processMessage, die einen MessageFormatter akzeptiert
// und einen Nachrichten-String, und dann das formatierte Ergebnis zurückgibt
// TODO: Basierend auf $formatterType ("upper" oder "bracket"), erstellen Sie den entsprechenden Formatter
// TODO: Rufen Sie processMessage mit dem Formatter und der Nachricht auf und geben Sie das Ergebnis aus
// TODO: Geben Sie die Musterkategorie in einer neuen Zeile aus
// 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 die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung