JavaRush /Java Blog /Random-IT /Modello di disegno del decoratore con esempi
Sbv239
Livello 23
Санкт-Петербург

Modello di disegno del decoratore con esempi

Pubblicato nel gruppo Random-IT
Il design pattern del decoratore ci consente di aggiungere dinamicamente funzionalità a un oggetto senza influenzare il comportamento degli oggetti della stessa classe. Sembra un po' confuso, ma una volta visto il codice tutto diventerà più chiaro. Caratteristiche - Un decoratore consente di aggiungere funzionalità a un oggetto esistente senza modificarne la struttura, ovvero la classe originale non cambia - Il modello di progettazione del decoratore è un modello strutturale che fornisce un wrapper per una classe esistente - Le classi del decoratore vengono create che avvolge la classe originale e fornisce funzionalità aggiuntive preservando intatte le firme dei metodi della classe originale - Il modello di progettazione del decoratore viene spesso utilizzato per seguire il principio di responsabilità singola di SOLID, poiché non carichiamo la classe originale con responsabilità aggiuntive, ma le dividiamo nelle classi del decoratore - Il decoratore è strutturalmente quasi simile al modello della catena di responsabilità (catena di responsabilità) È necessario tenere conto dei seguenti punti chiave - Un decoratore è utile per poter modificare il comportamento di un oggetto durante il runtime. Questo codice è facile da mantenere ed estendere. - Lo svantaggio di questo modello è che viene utilizzato un gran numero di oggetti decoratori dello stesso tipo - Il modello decoratore viene spesso utilizzato nelle classi IO Java (FileReader, BufferedReader, ecc.) Cosa faremo - Creare un'interfaccia - Creare calcestruzzo implementazioni di questa interfaccia - Creare un decoratore astratto, implementando questa interfaccia - Creiamo un decoratore concreto che eredita da un decoratore astratto - Utilizzare un decoratore concreto per "decorare" implementazioni concrete dell'interfaccia Implementazione : Creeremo l'interfaccia Shape e le classi concrete che implementano questa interfaccia. Successivamente creeremo una classe di decorazione astratta, ShapeDecorator, che implementa l'interfaccia Shape e ha un oggetto Shape come campo di classe. Modello di disegno del decoratore con esempi - 1 - Shape è il nome dell'interfaccia - Le classi Rectangle, Triangle e Circle saranno classi concrete che implementano l'interfaccia Shape - ShapeDecorator è una classe decoratrice astratta che implementa la stessa interfaccia Shape - RedShapeDecorator è una classe concreta che implementa ShapeDecorator - Demo è una classe demo in cui utilizzeremo RedShapeDecorator per decorare oggetti Shape Passo 1 : creare l'interfaccia Shape
public interface Shape {
    void draw();
}
Passaggio 2 : creiamo diverse implementazioni di questa interfaccia. Nell'esempio qui sotto ci sarà solo un cerchio, ma in realtà ne creeremo un altro paio: un rettangolo e un triangolo.
public class Circle implements Shape{
    @Override
    public void draw() {
        System.out.println("Я круг!");
    }
}
Passaggio 3 : crea un decoratore astratto che implementi l'interfaccia Shape
public abstract class ShapeDecorator implements Shape {

    protected Shape decoratedShape;

    //Конструктор, принимающий an object Shape
    public ShapeDecorator(Shape decoratedShape) {
        this.decoratedShape = decoratedShape;
    }

    public void draw() {
        decoratedShape.draw();
    }
}
Passaggio 4 : crea una classe di decoratore concreta che eredita dalla classe astratta
public class RedShapeDecorator extends ShapeDecorator{

    public RedShapeDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }

    @Override
    public void draw() {
        decoratedShape.draw();
        setRedBorder(decoratedShape);
    }

    private void setRedBorder(Shape decoratedShape) {
        System.out.println("Сообщение от RedShapeDecorator. Цвет границы: красный");
    }
}
Passaggio 5 : utilizza RedShapeDecorator per colorare i nostri oggetti
public class Demo {
    public static void main(String[] args)
    {
        Shape circle = new Circle();
        Shape redCircle= new RedShapeDecorator(new Circle());
        Shape redRectangle= new RedShapeDecorator(new Rectangle());
        Shape redTriangle = new RedShapeDecorator(new Triangle());

        System.out.println("\nОбычный круг:");
        circle.draw();

        System.out.println("\nКруг с красной границей:");
        redCircle.draw();

        System.out.println("\nПрямоугольник с красной границей:");
        redRectangle.draw();

        System.out.println("\nТреугольник с красной границей:");
        redTriangle.draw();
    }
}
Passo 6 : guarda la console e gioisci
Обычный круг:
Я круг!

Круг с красной границей:
Я круг!
Сообщение от RedShapeDecorator. Цвет границы: красный

Прямоугольник с красной границей:
Я прямоугольник!
Сообщение от RedShapeDecorator. Цвет границы: красный

Треугольник с красной границей:
Я треугольник!
Сообщение от RedShapeDecorator. Цвет границы: красный
Analizzando come esempio il design pattern del decoratore, possiamo concludere che il suo utilizzo è giustificato nei seguenti casi: - Quando vogliamo aggiungere, migliorare o eventualmente rimuovere il comportamento o lo stato di un oggetto - Quando vogliamo semplicemente cambiarne la funzionalità di un oggetto specifico di una classe e non lasciare alcuna modifica al resto. Grazie! Repository con file di progetto Basato su un articolo dal sito geeksforgeeks.org Il mio blog per un principiante Java Dev
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION