Cet article décrit un cas de petits pains cuits à la vapeur mis en œuvre par Java sur la base du modèle de décorateur. Partagez-le pour votre référence, comme suit:
1. Définition du modèle
Le motif du décorateur étend dynamiquement une fonction d'objet sans modifier le fichier d'origine et utiliser l'héritage. Il enveloppe l'objet réel en créant un objet d'emballage, c'est-à-dire la décoration.
Les objets décoratifs et les objets réels ont la même interface, afin que les objets clients puissent interagir avec les objets décoratifs de la même manière que les objets réels.
Un objet décoratif contient une référence à un vrai objet.
2. Exemples du modèle
1. Analyse des modèles
Nous utilisons le cas des vendeurs au cœur noir pour fabriquer des petits pains teints pour illustrer ce modèle.
2. Diagramme de classe statique du mode décorateur
3. Exemple de code
3.1 Créer une interface Bun à la vapeur - IBRead
package com.demo.abs; / ** * Interface de traitement de chignon à vapeur * * @author * * / interface publique IBRead {// Préparez les matériaux publics void prepair (); // harmonie public void kneeflour (); // Buns cuit à la vapeur public vide cuit à la vapeur (); / ** * Traitement des petits pains cuits à la vapeur * / public void process ();}3.2 Implémentation normale de BUN - Bread normal
Package com.demo.abs; / ** * Implémentation de petits pains cuits à la vapeur normaux * * @Author * * / public class NormalBread implémente IBread {// Préparer les ingrédients publics publics prépair () {System.out.println ("Préparer la farine, l'eau et la poudre à pâtisserie ..."); } // Hemian public void kneeflour () {System.out.println ("hmian ..."); } // Buns cuit à la vapeur public void cuit à la vapeur () {System.out.println ("Buns cuit à la vapeur ... les petits pains à la vapeur parfumés sont hors du four!"); } / ** * Traitement des petits pains cuits à la vapeur * / public void process () {// Préparez les ingrédients prepair (); // kneadflour (); // cuit à la vapeur (); }}3.3 Créer un décorateur abstrait - AbstractBread
package com.demo.decorator; import com.demo.abs.ibread; / ** * Résumé Decorator * * @author * * / public abstract class AbstractBread implémente ibread {// Stocker un objet IBread entrant pain ibread final privé; Public AbstractBread (pain ibread) {this.bread = pain; } // Préparez le matériel public void prépare () {this.bread.prepair (); } // Gently public void kneeflour () {this.bread.kneadflour (); } // vapeur cuit à la vapeur public void cuit à la vapeur () {this.bread.steamed (); } // Traitement des buns cuits à la vapeur public Void Process () {prepair (); KneeFlour (); à la vapeur(); }}3.4 Créer un décorateur de colorant - Corndecorator
Package com.demo.decorator; Import com.demo.abs.ibread; / ** * Dyeed Corn Buns * * @author * * / public class Corndecorator étend AbstractBread {// Construire la méthode publique Corndecorator (pain ibread) {super (pain); } // Les vendeurs au cœur noir ont commencé à teindre Public Void Paint () {System.out.println ("Ajouter un colorant jaune citron ..."); } // surcharge la méthode de pâte de la classe parent @Override public void kneeflour () {// this.paint () est démarré après l'ajout de colorant à la farine; // collez super.knEadflour (); }}3.5 Créer un décorateur de scalypse - SweetDecorator
package com.demo.decorator; import com.demo.abs.ibread; / ** * Cyperus vapeur cuit à la vapeur * * @author * * / classe publique sweetdecorator étend la paire abstract {// construire la méthode publique sweetdecorator (pain ibread) {super (pain); } // Les vendeurs au cœur noir commencent à ajouter Cyperus public void peinture () {System.out.println ("Ajouter Cyperus ..."); } // Surcharger la méthode de pâte de la classe parent @Override public void kneeflour () {// Démarrer la pâte. // hemma super.kneadflour (); }}3.6 Produire des petits pains cuits à la vapeur du maïs sucré - Client
package com.demo; import com.demo.abs.ibread; import com.demo.abs.normalbread; import com.demo.decorator.corndecorator; importer com.demo.decorator.sweetdecorator; / ** * application client * * @author * / public class Client {/ ** * @param args * / public Static Void Main (grath // Production de bains à vapeur décoratifs System.out.println ("/ n ====== Démarrer les petits pains à la vapeur décoratifs !!!"); // Créez une instance de chignon cuit à la vapeur normal // Ceci est une instance d'objet que nous devons envelopper (décorer) IBread NormalBread = new NormalBread (); // Commençons à décorer les petits pains cuits à la vapeur normaux! ! ! // Utilisez la saccharine pour décorer les pains cuits à la vapeur NormalBread = nouveau SweetDecorator (NormalBread); // Utilisez un colorant jaune citron pour décorer les petits pains à la vapeur normaux = nouveau Corndecorator (Bread normal); // Production d'informations sur les chignon à vapeur NormalBread.Process (); System.out.println ("===== Décorez l'extrémité des petits pains à la vapeur !!!"); }}4. Résultats de l'opération
==== Commencez à décorer des petits pains cuits à la vapeur! ! !
Préparez la farine, l'eau et la levure chimique ...
Ajouter un colorant jaune citron ...
Ajouter la cyanine ...
Graisse...
Petits pains à la vapeur ... les petits pains à la vapeur parfumés sont hors du four!
==== Le chignon décoratif cuit à la vapeur se termine! ! !
3. Les principes de conception de ce modèle
1 partie de changement fermé
Principe "ouvert et fermé"
3 Programmation orientée Résumé
4. préfère les combinaisons plutôt que l'héritage
4. Utiliser des occasions
1. Lorsque nous devons ajouter dynamiquement une nouvelle fonctionnalité ou responsabilité à un objet existant, nous pouvons envisager d'utiliser le modèle de décorateur.
2. Lorsque les responsabilités d'un objet changent souvent ou que les responsabilités doivent être augmentées dynamiquement, évitez d'ajouter une expansion de la sous-classe héréditaire pour s'adapter à de tels changements, car cette méthode entraînera un développement de la sous-classe trop rapidement et être difficile à contrôler. À l'heure actuelle, le mode décorateur peut être utilisé.
5. Diagramme de classe statique du mode décorateur
Pour plus d'informations sur les algorithmes Java, les lecteurs qui sont intéressés par ce site peuvent afficher les sujets: "Structure de données Java et tutoriel d'algorithme", "Résumé des conseils de nœud de Dom Operation Java", "Résumé du fichier Java et des conseils d'opération de répertoire" et "Résumé des conseils d'opération Java Cache"
J'espère que cet article sera utile à la programmation Java de tous.