Maison >Java >javaDidacticiel >Quels sont les principes et les méthodes d'implémentation du modèle de décoration dans les modèles de conception Java ?

Quels sont les principes et les méthodes d'implémentation du modèle de décoration dans les modèles de conception Java ?

WBOY
WBOYavant
2023-04-22 10:52:081151parcourir

1. Qu'est-ce que le mode décoration ?

Lorsque l'on souhaite améliorer ou enrichir la fonctionnalité d'un objet, mais que l'on ne souhaite pas hériter de la classe et créer des sous-classes, on peut envisager d'utiliser le mode décoration.

Utiliser le mode décoration pour améliorer une certaine fonction d'un objet est plus flexible que de générer une sous-classe puis de l'améliorer.

2. Comment implémenter

1) Composant abstrait : Définir une classe abstraite qui définit la méthode dont le « décorateur » a besoin pour être « décoré »

2) Composant concret : Une sous-classe de composant abstrait. Devenez une "classe décorée"

3) Composant décoratif : C'est aussi une sous-classe de composant abstrait. Cette classe contient une référence au « décorateur » et est utilisée pour appeler les méthodes du décorateur. Il peut s'agir d'une classe abstraite ou d'une classe non abstraite.

4) Classe de décoration en béton : C'est une sous-classe de composant de décoration, appelée "décorateur"

3) Implémentation du code

1) Composant abstrait

/**
 * 抽象组件,定义了被装饰类需要装饰的方法
 */
public abstract class ICake {
    /**
     * 需要装饰的方法
     * @return
     */
    public abstract int getPrice();
}

2) Décorateur

/**
 * 被装饰者,是抽象组件的一个子类,定义需要被装饰的方法
 */
public class Cake extends ICake {
    /**
     * 被装饰类中,装饰方法的基本实现
     * @return
     */
    @Override
    public int getPrice() {
        System.out.println("getPrice");
       return 100;
    }
}

3) Classe de décoration

/**
 * 装饰类,也是抽象组件的一个子类。
 * 可以是抽象类,也可以是非抽象类。
 */
public abstract class CakeDecorator extends ICake {
    /**
     * 被装饰类的引用,需要在装饰类中,调用到被装饰类的方法。
     */
    ICake cake;
    public CakeDecorator(ICake cake){
        this.cake = cake;
    }
}

4) Décoration spécifique

/**
 * 具体装饰类
 */
public class BlueBerryCake extends CakeDecorator {
    public BlueBerryCake(ICake cake) {
        super(cake);
    }
    /**
     * 被装饰的方法
     * 在调用到被装饰类的基础方法后,还要调用装饰类要增强的方法
     * @return
     */
    @Override
    public float getPrice(){
        return cake.getPrice()+elsePrice();
    }
    /**
     * 增强的方法
     * @return
     */
    private float elsePrice(){
        System.out.println("else getPrice");
        return 50;
    }
}

5) Classe de test

public class TestDecorator {
    public static void main(String args[]){
        ICake cake = new Cake();
        CakeDecorator decorater = new BlueBerryCake(cake);
        float price = decorater.getPrice();
        System.out.println(price);
    }
}

4. Expansion

1) L'amélioration d'une certaine méthode peut également être obtenue en utilisant l'héritage de sous-classe. Par rapport à la mise en œuvre via le mode décoration, quels sont les avantages du mode décoration ?

Le décorateur et le décorateur sont vaguement couplés. La classe de décoration ne dépend que du composant abstrait. La classe de décoration a seulement besoin de savoir que la classe décorée est une sous-classe du composant abstrait, sans savoir de quelle sous-classe il s'agit.

Le mode de décoration satisfait au "principe d'ouverture-fermeture", et vous pouvez ajouter une classe de décoration pour le composant sans modifier le composant spécifique.

5.JavaIo et mode décoration

De nombreuses classes du package java.IO utilisent le mode décoration.

Reader

FileReader

BufferedReader

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer