recherche
Maisondéveloppement back-endtutoriel phpModèle de décorateur : libérer la puissance des modèles de conception

Modèle de décorateur : libérer la puissance des modèles de conception

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!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
11 meilleurs scripts de raccourcissement d'URL PHP (gratuit et premium)11 meilleurs scripts de raccourcissement d'URL PHP (gratuit et premium)Mar 03, 2025 am 10:49 AM

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

Introduction à l'API InstagramIntroduction à l'API InstagramMar 02, 2025 am 09:32 AM

À 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

Travailler avec les données de session Flash dans LaravelTravailler avec les données de session Flash dans LaravelMar 12, 2025 pm 05:08 PM

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-

Misque de réponse HTTP simplifié dans les tests LaravelMisque de réponse HTTP simplifié dans les tests LaravelMar 12, 2025 pm 05:09 PM

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' =>

Construisez une application React avec un Laravel Back End: Partie 2, ReactConstruisez une application React avec un Laravel Back End: Partie 2, ReactMar 04, 2025 am 09:33 AM

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

Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API RESTCurl dans PHP: Comment utiliser l'extension PHP Curl dans les API RESTMar 14, 2025 am 11:42 AM

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

12 meilleurs scripts de chat PHP sur Codecanyon12 meilleurs scripts de chat PHP sur CodecanyonMar 13, 2025 pm 12:08 PM

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é

Annonce de l'enquête sur la situation en 2025 PHPAnnonce de l'enquête sur la situation en 2025 PHPMar 03, 2025 pm 04:20 PM

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

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

SublimeText3 version Mac

SublimeText3 version Mac

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

SublimeText3 Linux nouvelle version

SublimeText3 Linux nouvelle version

Dernière version de SublimeText3 Linux

Listes Sec

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

Version Mac de WebStorm

Outils de développement JavaScript utiles

SublimeText3 version anglaise

SublimeText3 version anglaise

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