Introduction aux patrons de conception
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 70 sur 91.
Les modèles de conception sont des solutions éprouvées à des problèmes courants que les développeurs rencontrent régulièrement lors de la création de logiciels. Plutôt que de réinventer la roue à chaque fois, vous pouvez appliquer ces modèles établis pour résoudre des problèmes similaires dans votre propre code.
Considérez les patrons de conception comme des recettes. Tout comme un chef suit une recette pour créer un plat perfectionné au fil du temps, les développeurs utilisent les patrons de conception pour structurer leur code de manière éprouvée et affinée par d’innombrables programmeurs avant eux.
Les patrons de conception sont généralement regroupés en trois catégories :
| Catégorie | Objectif | Exemples |
|---|---|---|
| Création | Comment les objets sont créés | Singleton, Factory |
| Structurel | Comment les objets sont composés | Adapter, Decorator |
| Comportemental | Comment les objets communiquent | Observer, Strategy |
Vous avez en fait utilisé des modèles tout au long de ce cours sans vous en rendre compte. Lorsque vous avez créé des classes abstraites avec des méthodes que les classes enfants doivent implémenter, vous appliquiez une forme du modèle Template Method. Lorsque vous avez utilisé des interfaces pour définir des contrats, vous prépariez la mise en place du modèle Strategy.
Apprendre les patrons de conception vous donne un vocabulaire commun avec les autres développeurs. Au lieu d’expliquer une structure complexe en détail, vous pouvez simplement dire « J’ai utilisé ici le patron Factory » et les développeurs expérimentés comprendront immédiatement votre approche. Dans les leçons suivantes, nous implémenterons plusieurs patrons essentiels en PHP.
Défi
FacileConstruisons un système simple de formatage de messages qui montre comment les patrons de conception aident à organiser le code. Tu identifieras à quelle catégorie de patrons appartient chaque composant et tu verras comment les différentes parties d’un système fonctionnent ensemble.
Tu organiseras ton code sur trois fichiers :
MessageFormatter.php: crée une interface appeléeMessageFormatterqui définit un contrat pour le formatage des messages. Elle doit avoir une seule méthodeformat(string $message): string. Cela représente la catégorie comportementale. Elle définit la manière dont les objets communiquent et traitent les données.Formatters.php: inclus le fichier MessageFormatter et crée deux classes qui implémentent l’interface :UppercaseFormatter: sa méthodeformat()renvoie le message converti en majusculesBracketFormatter: sa méthodeformat()entoure le message de crochets, comme dans[message]
main.php: inclus le fichier Formatters. Tu recevras deux entrées : une chaîne de caractères représentant un message et un type de formateur ("upper"ou"bracket").Crée une fonction appelée
processMessagequi accepte unMessageFormatteret une chaîne de caractères représentant un message, puis renvoie le résultat formaté. Cette fonction n’a pas besoin de savoir quel formateur précis elle reçoit. Elle appelle simplementformat()sur l’objet qui lui est transmis.En fonction de l’entrée indiquant le type de formateur, crée l’objet formateur approprié. Transmets-le à ta fonction
processMessageavec le message, puis affiche le résultat.Sur une nouvelle ligne, affiche la catégorie de patrons que cette structure représente. Puisque nous définissons des comportements interchangeables au moyen d’une interface, affiche :
Pattern category: Behavioral
Ce défi montre comment les interfaces te permettent de remplacer des implémentations sans modifier le code qui les utilise : c’est une base pour des patrons comme Strategy, que tu exploreras dans les prochaines leçons.
Essayez vous-même
<?php
require_once 'Formatters.php';
// Lire l'entrée
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: Créer une fonction appelée processMessage qui accepte un MessageFormatter
// et une chaîne de message, puis retourne le résultat formaté
// TODO: Basé sur $formatterType ("upper" ou "bracket"), créer le formateur approprié
// TODO: Appeler processMessage avec le formateur et le message, puis afficher le résultat
// TODO: Print the pattern category on a new line
// Format: "Pattern category: Behavioral"
?>Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition des méthodesLe mot-clé finalClasses abstraitesRécapitulatif – Hiérarchie des employés7Encapsulation
Public, Protected, PrivateModificateurs d’accès en profondeurAccesseurs et mutateursDissimulation de l’informationPromotion des constructeurs (8.0)Récapitulatif – Système de fiches étudiant10Concepts avancés de la POO
Composition ou héritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibres (PHP 8.1)Approfondissement du clonage d’objetsGénérateurs et itérateurs13Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron Dépôt2Espaces de noms et chargement automatique
Introduction aux espaces de nomsLe mot-clé useNorme de chargement automatique PSR-4Autoloader de ComposerRécapitulatif - Projet organisé5Interfaces et contrats
Introduction aux interfacesImplémentation des interfacesImplémentation de plusieurs interfacesInterface ou classe abstraiteIndication de type avec les interfacesRécapitulatif - Calculateur de formes8Méthodes magiques
Introduction aux méthodes magiques__toString et __debugInfo__get, __set, __isset, __unset__call et __callStatic__clone et clonage d’objets__serialize et __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d’instance vs statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés en lecture seule (PHP 8.1)Récapitulatif - Gestionnaire de comptes bancaires6Polymorphisme
Révision de la redéfinition des méthodesPolymorphisme via les interfacesAnnotations de type et types unionLiaison statique tardiveRécapitulatif - Processeur de paiements9Traits
Introduction aux traitsUtilisation de plusieurs traitsRésolution des conflits entre traitsMéthodes abstraites dans les traitsTraits par rapport à l’héritage12Patrons de conception – Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur PHP en ligne