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("初始行为"); } }
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(); } }
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("添加行为"); } }
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(); } }
Résultat en cours
初始行为 ====================================== 初始行为 添加属性: 新属性1 ====================================== 初始行为 添加属性: 新属性1 添加行为
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 !