Cet article décrit les principes et l'utilisation des modes décoratifs des modèles de conception Java. Partagez-le pour votre référence, comme suit:
Le mode décoratif peut étendre dynamiquement la fonctionnalité d'un objet sans modifier le fichier d'origine et utiliser l'héritage. Il enveloppe l'objet réel en créant un objet wrapper, c'est-à-dire la décoration. La conception de IO dans JDK utilise le mode décoratif, qui peut élargir la fonction en enveloppe le flux de nœud à travers le flux de filtrage.
La composition du personnage en mode décoratif:
① Rôle du composant abstrait: Donnez une interface abstraite pour normaliser les objets prêts à recevoir des fonctions de traitement. (InputStream, OutputStream)
② Rôle du composant concret: définit une classe qui recevra des fonctions supplémentaires. (Flux de nœud)
③ Rôle du décorateur: détient une instance d'un objet composant et implémente une interface cohérente avec l'interface de composante abstraite. (FilterInputStream, filterOutStream)
④ Rôle du décorateur en béton: responsable de l'ajout de fonctions supplémentaires aux objets des composants. (Filtre Flux avec des fonctions supplémentaires spécifiques, BufferedInputStream, DatainputStream, etc.)
Voici un exemple simple de motif décoratif:
1. Rôle du composant abstrait : définir un composant d'interface
package com.tydic.decorator; // Rôle de composant abstrait Composant d'interface publique {public void doSomething ();}2. Rôles de construction spécifiques : vous devez implémenter des rôles de composants abstraits et vous pouvez ajouter des responsabilités à cet objet.
package com.tydic.decorator; / ** * Construction du rôle de béton, implémentation de la construction de rôles abstraits * @author Administrator * * / public class ConcreteComponent implémente composant {@Override public void dosomething () {System.out.println ("fonction a"); }} 3. Décorez le rôle : maintenez un objet pour créer une référence au rôle et implémenter les rôles de composants abstraits. Le rôle de composant abstrait est implémenté car le type ne peut pas être modifié après l'ajout de fonctions, tout comme FilterInputStream est toujours un flux d'entrée, qui a toujours les caractéristiques d'un flux d'entrée. La référence à un rôle de construction d'objets est parce que pour ajouter des fonctions, vous devez maintenir une référence au rôle de composant auquel la fonction doit être attachée.
package com.tydic.decorator; / ** * décorer le rôle, maintenir une référence à un rôle de composant et implémenter le rôle de composant * Si vous souhaitez ajouter une fonction, vous devez implémenter le rôle de composant. Pour ajouter une fonction, vous devez maintenir une référence au rôle de composant à attacher. C'est pourquoi vous devez maintenir une référence au rôle des composants * @Author Administrator * * / public class Decorator implémente composant {composant privé Composant; // Il s'agit du rôle de composant à attacher, qui peut être téléchargé dans le décorateur public instancié (composant composant) {this.component = composant; } @Override public void dosomething () {composant.dosomething (); }}4. Rôle décoratif spécifique : Les rôles décoratifs doivent être hérités et les fonctions à attacher sont données.
Package com.tydic.decorator; / ** * Pour un rôle décoratif spécifique 1, le rôle décoratif doit être hérité et les fonctions à attacher sont données * @Author Administrator * * / public class ConcreteDecorator1 étend décorateur {public ConcreteDeCorator1 (composant composant) {super (composant); } @Override public void dosomething () {super.dosomething (); this.doanothing (); // ajouter des fonctions sur la base des fonctions d'origine des rôles de composants spécifiques passés} // fonctions supplémentaires public void doanothing () {System.out.println ("fonction b"); }} Package com.tydic.decorator; / ** * Pour un rôle décoratif spécifique 2, le rôle décoratif doit être hérité et les fonctions à attacher sont données * @Author Administrator * * / public class ConcreteDecorator2 étend décorateur {public ConcreteDeCorator2 (composant composant) {super (composant); } @Override public void dosomething () {super.dosomething (); this.doanothing (); // fonctions supplémentaires public void doanothing () {System.out.println ("fonction c"); }}5. Écrivez le code client
package com.tydic.decorator; public class Client {public static void main (String [] args) {composant composant = new ConcreteComponent (); // construire le composant composant 2 = new ConcreteCorator1 (composant); // décorer le composant composant composant 3 = new ConcreteDecorator2 (Component2); // decorate the component the componse composant3.doSomething (); }}Résumer:
Le mode décoratif peut utiliser la méthode de combinaison et développer dynamiquement des objets à l'exécution sans héritage. C'est quelque chose que l'héritage ne peut pas faire. L'héritage est statique, une extension de la classe.
Avantages et inconvénients du mode décoratif:
Avantages: 1. Étendez la fonction de l'objet, qui est plus flexible que l'héritage. 2. En utilisant différentes catégories décoratives spécifiques et la disposition et la combinaison de ces catégories décoratives, les concepteurs peuvent créer de nombreuses combinaisons de comportements différents.
Inconvénients: cela rendra le programme plus compliqué.
Pour plus de contenu lié à Java, les lecteurs qui sont intéressés par ce site peuvent afficher les sujets: "Introduction et tutoriel avancé sur la programmation Java Oriented Oriented", "Tutorial sur la structure de données Java et l'algorithme", "Résumé des compétences de l'opération Java Dom Dom", "Résumé des compétences de l'opération Java et de l'opération de répertoire" et "Résumé de Java Cache Skills"
J'espère que cet article sera utile à la programmation Java de tous.