Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Erstellen 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 namens MessageFormatter, das einen Vertrag für die Formatierung von Nachrichten definiert. Es sollte eine einzige Methode format(string $message): string enthalten. 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 Methode format() gibt die Nachricht in Großbuchstaben umgewandelt zurück
    • BracketFormatter: Die Methode format() 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 ein MessageFormatter und eine Nachrichtenzeichenkette akzeptiert und anschließend das formatierte Ergebnis zurückgibt. Diese Funktion muss nicht wissen, welchen konkreten Formatierer sie erhält. Sie ruft einfach format() 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 processMessage und 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"

?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-PHP-Compiler