O padrão de design decorador nos permite adicionar funcionalidade dinamicamente a um objeto sem afetar o comportamento dos objetos da mesma classe. Parece um pouco confuso, mas depois de ver o código tudo ficará mais claro. Características - Um decorador permite adicionar funcionalidade a um objeto existente sem alterar sua estrutura, ou seja, a classe original não muda - O padrão de design decorador é um padrão estrutural que fornece um wrapper para uma classe existente - Classes decoradoras são criadas que envolver a classe original e fornecer funcionalidade adicional enquanto preserva intactas as assinaturas dos métodos da classe original - O padrão de design decorador é mais frequentemente usado para seguir o princípio de responsabilidade única do SOLID, uma vez que não carregamos a classe original com responsabilidades adicionais, mas as dividimos em classes de decoradores - O decorador é estruturalmente quase semelhante ao padrão de cadeia de responsabilidade (cadeia de responsabilidade) Os seguintes pontos-chave devem ser levados em consideração - Um decorador é útil por poder modificar o comportamento de um objeto durante o tempo de execução. Este código é fácil de manter e estender. - A desvantagem deste padrão é que um grande número de objetos decoradores do mesmo tipo são usados - O padrão decorador é frequentemente usado em classes Java IO (FileReader, BufferedReader, etc.) O que faremos - Criar uma interface - Criar concreto implementações desta interface - Crie um decorador abstrato, implementando esta interface - Vamos criar um decorador concreto que herda de um decorador abstrato - Use um decorador concreto para "decorar" implementações concretas da interface Implementação : Criaremos a interface Shape e as classes concretas que implementam esta interface. A seguir, criaremos uma classe de decorador abstrata, ShapeDecorator, que implementa a interface Shape e tem um objeto Shape como campo de classe. - Shape é o nome da interface - As classes Rectangle, Triangle e Circle serão classes concretas que implementam a interface Shape - ShapeDecorator é uma classe decorativa abstrata que implementa a mesma interface Shape - RedShapeDecorator é uma classe concreta que implementa ShapeDecorator - Demo é uma classe de demonstração na qual usaremos RedShapeDecorator para decorar objetos Shape Etapa 1 : criar a interface Shape
public interface Shape {
void draw();
}
Passo 2 : Vamos criar diversas implementações desta interface. No exemplo abaixo haverá apenas um círculo, mas na verdade criaremos mais alguns: um retângulo e um triângulo.
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("Я круг!");
}
}
Etapa 3 : Crie um decorador abstrato que implemente a interface 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();
}
}
Etapa 4 : crie uma classe de decorador concreta que herde da classe abstrata
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. Цвет границы: красный");
}
}
Etapa 5 : use RedShapeDecorator para colorir nossos objetos
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 : olhe para o console e alegre-se
Обычный круг:
Я круг!
Круг с красной границей:
Я круг!
Сообщение от RedShapeDecorator. Цвет границы: красный
Прямоугольник с красной границей:
Я прямоугольник!
Сообщение от RedShapeDecorator. Цвет границы: красный
Треугольник с красной границей:
Я треугольник!
Сообщение от RedShapeDecorator. Цвет границы: красный
Tendo examinado o padrão de design decorador como exemplo, podemos concluir que a sua utilização se justifica nos seguintes casos: - Quando queremos adicionar, melhorar ou possivelmente remover o comportamento ou estado de um objeto - Quando queremos simplesmente alterar a funcionalidade de um objeto específico de uma classe e não deixe o resto sem alterações. Obrigado! Repositório com arquivos de projeto Baseado em um artigo do site geeksforgeeks.org Meu blog para um Java Dev iniciante
GO TO FULL VERSION