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 patrons de conception (design patterns) sont des solutions éprouvées à des problèmes courants que les développeurs rencontrent de manière répétée 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 défis 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 qui a été perfectionné au fil du temps, les développeurs utilisent des patrons de conception pour structurer leur code de manières qui ont été testées et affinées par d'innombrables programmeurs avant eux.
Les modèles 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, Fabrique |
| Structure | Comment les objets sont composés | Adaptateur, Décorateur |
| Comportement | Comment les objets communiquent | Observateur, Stratégie |
Vous avez en fait utilisé des patrons de conception 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 filles doivent implémenter, vous appliquiez une forme du patron Template Method. Lorsque vous avez utilisé des interfaces pour définir des contrats, vous vous prépariez au patron Strategy.
Apprendre les patrons de conception vous donne un vocabulaire commun avec d'autres développeurs. Au lieu d'expliquer une structure complexe en détail, vous pouvez simplement dire « J'ai utilisé le patron Factory ici » 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 démontre comment les patrons de conception aident à organiser le code. Vous identifierez à quelle catégorie de patron chaque composant appartient et verrez comment les différentes parties d'un système fonctionnent ensemble.
Vous organiserez votre code sur trois fichiers :
MessageFormatter.php— Créez une interface nommé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 behavioral (comportementale) — elle définit comment les objets communiquent et traitent les données.Formatters.php— Incluez le fichier MessageFormatter et créez deux classes qui implémentent l'interface :UppercaseFormatter— Sa méthodeformat()retourne le message converti en majusculesBracketFormatter— Sa méthodeformat()enveloppe le message dans des crochets comme[message]
main.php— Incluez le fichier Formatters. Vous recevrez deux entrées : une chaîne de caractères pour le message et un type de formateur ("upper"ou"bracket").Créez une fonction nommée
processMessagequi accepte unMessageFormatteret une chaîne de caractères de message, puis retourne le résultat formaté. Cette fonction n'a pas besoin de savoir quel formateur spécifique elle reçoit — elle appelle simplementformat()sur n'importe quel objet qui lui est passé.En fonction du type de formateur reçu en entrée, créez l'objet formateur approprié. Passez-le à votre fonction
processMessageavec le message, et affichez le résultat.Sur une nouvelle ligne, affichez la catégorie de patron que cette structure représente. Puisque nous définissons des comportements interchangeables via une interface, affichez :
Pattern category: Behavioral
Ce défi montre comment les interfaces vous permettent d'échanger des implémentations sans modifier le code qui les utilise — une base pour des patrons comme Strategy que vous explorerez dans les prochaines leçons.
Aide-mémoire
Les patrons de conception (design patterns) sont des solutions éprouvées à des problèmes de programmation courants qui fournissent des modèles pour structurer le code efficacement.
Les patrons de conception sont regroupés en trois catégories :
| Catégorie | Objectif | Exemples |
|---|---|---|
| Création | Comment les objets sont créés | Singleton, Factory |
| Structure | Comment les objets sont composés | Adapter, Decorator |
| Comportement | Comment les objets communiquent | Observer, Strategy |
Les patrons de conception fournissent un vocabulaire commun aux développeurs, facilitant la communication des décisions architecturales complexes.
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: Selon $formatterType ("upper" ou "bracket"), créer le formateur approprié
// TODO: Appeler processMessage avec le formateur et le message, puis afficher le résultat
// TODO: Afficher la catégorie du patron sur une nouvelle ligne
// 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
1Les bases de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition de méthodeLe mot-clé finalClasses abstraitesRécapitulatif - Hiérarchie des employés7Encapsulation
Public, Protégé, PrivéModificateurs d'accès en détailGetters et SettersMasquage d'informationPromotion de constructeur (8.0)Récapitulatif - Système de gestion d'étudiants10Concepts avancés de la POO
Composition vs HéritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibers (PHP 8.1)Clonage d'objets : analyse approfondieGénérateurs et Itérateurs13Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository2Espaces de noms et Autoloading
Introduction aux espaces de nomsLe mot-clé useStandard d'Autoloading PSR-4L'Autoloader ComposerRécapitulatif - Projet organisé5Interfaces et Contrats
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesInterface vs Classe AbstraiteType Hinting avec les InterfacesRécapitulatif - Calculateur de Formes8Méthodes magiques
Introduction aux méthodes magiques__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Clonage d'objets__serialize & __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d'instance vs Propriétés statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés readonly (PHP 8.1)Récapitulatif - Gestionnaire de compte bancaire6Polymorphisme
Retour sur la redéfinition de méthodePolymorphisme via les interfacesType Hinting et Types d'unionLiaison statique tardiveRécapitulatif - Processeur de paiement9Traits
Introduction aux TraitsUtilisation de plusieurs TraitsRésolution des conflits de TraitsMéthodes abstraites dans les TraitsTraits vs Héritage12Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie