


Plus tôt dans cette série, nous avons exploré les modèles de conception de façade et d'adaptateur de cette série. En utilisant Facade, nous pouvons simplifier les grands systèmes et en implémentant des adaptateurs, nous pouvons rester en sécurité lors de l'utilisation d'API et de classes externes. Nous allons maintenant présenter le modèle de conception du décorateur, qui entre également dans la catégorie des modèles structurels.
Lorsque nous voulons simplement donner des responsabilités supplémentaires à la classe de base, nous pouvons utiliser le modèle décorateur. Ce modèle de conception est une excellente alternative aux fonctionnalités de sous-classement, étendant les fonctionnalités et offrant des avantages supplémentaires.
Question
Si vous êtes confus et pensez que nous pouvons également obtenir la même fonctionnalité en sous-classant les fonctionnalités, laissez-moi vous montrer quelques exemples de code qui dissiperont votre confusion et vous feront aimer le modèle de décorateur.
Je vais donner un exemple de classe chargée de générer du contenu d'e-mail. Dans le bloc de code suivant, comme vous pouvez le voir, cette classe génère très bien le contenu de l'e-mail sans aucune modification.
class eMailBody { private $header = 'This is email header'; private $footer = 'This is email Footer'; public $body = ''; public function loadBody() { $this->body .= "This is Main Email body.<br />"; } }
Nous savons que Noël approche, alors supposons que je veuille saluer mes lecteurs dans mon prochain e-mail de newsletter. Je dois donc ajouter un message dans le corps de l'email avec une image qui a l'air bien.
Pour cela, je pourrais éditer directement dans mon cours de messagerie, mais je ne veux vraiment pas faire ça. Je peux donc implémenter l'héritage pour obtenir le même effet. Je crée une sous-classe distincte de la classe principale du corps de l'e-mail :
class christmasEmail extends eMailBody { public function loadBody() { parent::loadBody(); $this->body .= "Added Content for Xmas<br />"; } } $christmasEmail = new christmasEmail(); $christmasEmail->loadBody(); echo $christmasEmail->body;
J'ai donc terminé mon code et après quelques jours, j'ai voulu envoyer un e-mail avec mes vœux pour la nouvelle année. Nous pouvons utiliser la même approche que Noël.
class newYearEmail extends eMailBody { public function loadBody() { parent::loadBody(); $this->body .= "Added Content for New Year<br />"; } } $newYearEmail = new newYearEmail(); $newYearEmail->loadBody(); echo $newYearEmail->body;
Tout s'est bien passé sans aucun problème. Maintenant, disons que j'ai oublié de saluer mes visiteurs à ces deux occasions (Noël et Nouvel An) et que je souhaite envoyer les deux salutations dans un seul e-mail sans modifier aucun code dans la classe de base.
Votre esprit est immédiatement rempli des questions suivantes : le sous-classement et l'héritage seront-ils utiles ici ? Je suis favorable à cela, mais nous devons utiliser du code supplémentaire/inutile pour y parvenir. Nous pouvons utiliser des traits pour réaliser quelque chose de similaire à l’héritage multiple.
Solution
Le problème dont nous avons discuté dans la section précédente peut être résolu en implémentant le modèle décorateur.
Selon Wikipédia :
Le modèle Decorator (également connu sous le nom de Wrapper, une nomenclature alternative partagée avec le modèle Adapter) est un modèle de conception qui permet l'ajout statique ou dynamique de comportement à un seul objet sans affecter le comportement des autres objets. Même classe.
Dans la section précédente, nous avons vu que nous pouvons étendre les fonctionnalités/comportements à l'aide d'une sous-classe, mais lorsqu'il s'agit d'ajouter plusieurs fonctionnalités/comportements, cela devient verbeux et complexe. C’est là que nous devrions utiliser le modèle décorateur.
Interface
interface eMailBody { public function loadBody(); }
Il s'agit d'une interface simple utilisée pour garantir que certaines classes doivent implémenter les méthodes requises.
Principales catégories d'e-mails
class eMail implements eMailBody { public function loadBody() { echo "This is Main Email body.<br />"; } }
C'est la classe principale qui génère le corps par défaut des e-mails, je l'utilise habituellement pour envoyer des e-mails. Cependant, ce dont j'ai besoin, c'est de modifier le contenu du corps en fonction de certaines occasions, mais pas de changer la classe de courrier électronique principale.
Maître Décorateur
abstract class emailBodyDecorator implements eMailBody { protected $emailBody; public function __construct(eMailBody $emailBody) { $this->emailBody = $emailBody; } abstract public function loadBody(); }
Il s'agit de notre classe de décorateur principale, elle contient une référence à notre classe de courrier électronique principale et modifie son comportement si nécessaire. Nous définissons ici une méthode abstraite, loadBody
, que les enfants décorateurs doivent mettre en œuvre pour changer de comportement.
Décorateur Enfant
class christmasEmailBody extends emailBodyDecorator { public function loadBody() { echo 'This is Extra Content for Christmas<br />'; $this->emailBody->loadBody(); } } class newYearEmailBody extends emailBodyDecorator { public function loadBody() { echo 'This is Extra Content for New Year.<br />'; $this->emailBody->loadBody(); } }
Ici, nous avons créé deux sous-classes du décorateur principal qui effectuent réellement des changements de comportement sur notre classe de messagerie principale.
Emballez le tout ensemble
Nous avons créé tous les éléments requis. Tout ce que nous avons à faire est d'utiliser notre code et d'en profiter.
interface eMailBody { public function loadBody(); } class eMail implements eMailBody { public function loadBody() { echo "This is Main Email body.<br />"; } } abstract class emailBodyDecorator implements eMailBody { protected $emailBody; public function __construct(eMailBody $emailBody) { $this->emailBody = $emailBody; } abstract public function loadBody(); } class christmasEmailBody extends emailBodyDecorator { public function loadBody() { echo 'This is Extra Content for Christmas<br />'; $this->emailBody->loadBody(); } } class newYearEmailBody extends emailBodyDecorator { public function loadBody() { echo 'This is Extra Content for New Year.<br />'; $this->emailBody->loadBody(); } }
Nous allons maintenant utiliser ce cours de décorateur de différentes manières selon les besoins :
/* * Normal Email */ $email = new eMail(); $email->loadBody(); // Output This is Main Email body. /* * Email with Xmas Greetings */ $email = new eMail(); $email = new christmasEmailBody($email); $email->loadBody(); // Output This is Extra Content for Christmas This is Main Email body. /* * Email with New Year Greetings */ $email = new eMail(); $email = new newYearEmailBody($email); $email->loadBody(); // Output This is Extra Content for New Year. This is Main Email body. /* * Email with Xmas and New Year Greetings */ $email = new eMail(); $email = new christmasEmailBody($email); $email = new newYearEmailBody($email); $email->loadBody(); // Output This is Extra Content for New Year. This is Extra Content for Christmas This is Main Email body.
Nous pouvons voir que nous avons maintenant modifié le corps de l'e-mail sans modifier la classe principale de l'e-mail.
Conclusion
Chaque application que nous avons nécessite régulièrement des modifications et/ou des améliorations. Ainsi, dans ce cas, nous pouvons implémenter le modèle de conception du décorateur qui, à terme, améliorera la qualité du code et rendra notre code plus évolutif.
J'ai fait de mon mieux pour vous expliquer le motif du décorateur, mais si vous avez d'autres commentaires ou questions, n'hésitez pas à les ajouter au flux ci-dessous.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Les longues URL, souvent encombrées de mots clés et de paramètres de suivi, peuvent dissuader les visiteurs. Un script de raccourcissement d'URL offre une solution, créant des liens concis idéaux pour les médias sociaux et d'autres plateformes. Ces scripts sont utiles pour les sites Web individuels

À la suite de son acquisition de haut niveau par Facebook en 2012, Instagram a adopté deux ensembles d'API pour une utilisation tierce. Ce sont l'API graphique Instagram et l'API d'affichage de base Instagram. En tant que développeur créant une application qui nécessite des informations à partir d'un

Laravel simplifie la gestion des données de session temporaires à l'aide de ses méthodes de flash intuitives. Ceci est parfait pour afficher de brefs messages, alertes ou notifications dans votre application. Les données ne persistent que pour la demande ultérieure par défaut: $ demande-

Laravel fournit une syntaxe de simulation de réponse HTTP concise, simplifiant les tests d'interaction HTTP. Cette approche réduit considérablement la redondance du code tout en rendant votre simulation de test plus intuitive. L'implémentation de base fournit une variété de raccourcis de type de réponse: Utiliser illuminate \ support \ faades \ http; Http :: faux ([[ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

Il s'agit de la deuxième et dernière partie de la série sur la construction d'une application React avec un back-end Laravel. Dans la première partie de la série, nous avons créé une API RESTful utilisant Laravel pour une application de liste de base sur le produit. Dans ce tutoriel, nous serons Dev

L'extension PHP Client URL (CURL) est un outil puissant pour les développeurs, permettant une interaction transparente avec des serveurs distants et des API REST. En tirant parti de Libcurl, une bibliothèque de transfert de fichiers multi-protocol très respectée, PHP Curl facilite Efficient Execu

Voulez-vous fournir des solutions instantanées en temps réel aux problèmes les plus pressants de vos clients? Le chat en direct vous permet d'avoir des conversations en temps réel avec les clients et de résoudre leurs problèmes instantanément. Il vous permet de fournir un service plus rapide à votre personnalité

L'enquête sur le paysage PHP 2025 étudie les tendances actuelles de développement du PHP. Il explore l'utilisation du cadre, les méthodes de déploiement et les défis, visant à fournir des informations aux développeurs et aux entreprises. L'enquête prévoit la croissance de la PHP moderne versio


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

SublimeText3 Linux nouvelle version
Dernière version de SublimeText3 Linux

Listes Sec
SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.

Version Mac de WebStorm
Outils de développement JavaScript utiles

SublimeText3 version anglaise
Recommandé : version Win, prend en charge les invites de code !
