Maison > Java > javaDidacticiel > Modèle de décorateur dans la série de modèles de conception Java

Modèle de décorateur dans la série de modèles de conception Java

高洛峰
Libérer: 2017-01-19 15:56:59
original
1055 Les gens l'ont consulté

Qu'est-ce que le motif Décorateur ?
Ajoutez dynamiquement des responsabilités supplémentaires à un objet. En termes d'ajout de fonctionnalités, le modèle Decorator est plus flexible que la génération de sous-classes.
1. Structure

Composant : Définir une interface d'objet qui peut ajouter dynamiquement des responsabilités à ces objets.

interface Component {
  public void operation();
}
ConcreteComponent : 实现 Component 定义的接口。
class ConcreteComponent implements Component {
  @Override
  public void operation() {
    System.out.println("初始行为");
  }
}
Copier après la connexion

Decorator : Classe abstraite décorative, qui hérite de Component et étend les fonctions de la classe Component à partir de classes externes, mais pour Component, il n'est pas nécessaire de connaître l'existence de Decorator.

class Decorator implements Component {
  // 持有一个 Component 对象,和 Component 形成聚合关系
  protected Component component;
   
  // 传入要进一步修饰的对象
  public Decorator(Component component) {
    this.component = component;
  }
   
  @Override
  // 调用要修饰对象的原方法
  public void operation() {
    component.operation();
  }
}
Copier après la connexion

ConcreteDecorator : Un objet de décoration spécifique qui a pour fonction d'ajouter des responsabilités au composant.

class ConcreteDecoratorA extends Decorator {
  private String addedState = "新属性1";
   
  public ConcreteDecoratorA(Component component) {
    super(component);
  }
   
  public void operation() {
    super.operation();
    System.out.println("添加属性: " + addedState);
  }
}
 
class ConcreteDecoratorB extends Decorator {
  public ConcreteDecoratorB(Component component) {
    super(component);
  }
 
  public void operation() {
    super.operation();
    AddedBehavior();
  }
   
  public void AddedBehavior() {
    System.out.println("添加行为");
  }
}
Copier après la connexion

Code du test

public class DecoratorPattern {
  public static void main(String[] args) {
    Component component = new ConcreteComponent();
    component.operation();
     
    System.out.println("======================================");
    Decorator decoratorA = new ConcreteDecoratorA(component);
    decoratorA.operation();
     
    System.out.println("======================================");
    Decorator decoratorB = new ConcreteDecoratorB(decoratorA);
    decoratorB.operation();
  }
}
Copier après la connexion

Résultat en cours

初始行为
======================================
初始行为
添加属性: 新属性1
======================================
初始行为
添加属性: 新属性1
添加行为
Copier après la connexion

2. Scénarios d'application

1 Il est nécessaire d'ajouter des responsabilités à un objet de manière dynamique et transparente, c'est-à-dire sans affecter les autres objets.
2. Les fonctions doivent être ajoutées dynamiquement à un objet, et ces fonctions peuvent être révoquées dynamiquement.
3. Un très grand nombre de fonctions générées par la permutation et la combinaison de certaines fonctions de base doivent être ajoutées, ce qui rend la relation d'héritage irréaliste.
4. Lorsque la méthode de génération de sous-classes ne peut pas être utilisée pour l'expansion. Dans un cas, il peut y avoir un grand nombre d'extensions indépendantes, et un grand nombre de sous-classes seront générées pour prendre en charge chaque combinaison, provoquant une explosion du nombre de sous-classes. Un autre cas pourrait être dû au fait que la définition de classe est masquée ou qu'elle ne peut pas être utilisée pour générer des sous-classes.

3. Points clés

1. Les objets décorés et les objets réels ont la même interface. L'objet client peut ainsi interagir avec l'objet décoré de la même manière qu'un objet réel.

2. L'objet de décoration contient une référence à l'objet réel.

3. L'objet de décoration accepte toutes les demandes du client. Il transmet ces requêtes aux objets réels.

4. L'objet de décoration peut ajouter quelques fonctions supplémentaires avant ou après la transmission de ces demandes. Cela garantit que des fonctionnalités supplémentaires peuvent être ajoutées en externe au moment de l'exécution sans modifier la structure d'un objet donné. Dans la conception orientée objet, l’extension fonctionnelle d’une classe donnée est généralement implémentée via l’héritage.

Ce qui précède est une introduction au modèle de décorateur Java. J'espère qu'il sera utile à l'apprentissage de chacun.

Pour plus d'articles liés au modèle décorateur dans la série de modèles de conception Java, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal