Intención: agregar dinámicamente algunas responsabilidades adicionales a un objeto. El patrón decorador es más flexible que la subclasificación en términos de agregar funcionalidad.
Solución principal: generalmente, para extender una clase, a menudo usamos la herencia para implementarla.Dado que la herencia introduce características estáticas en la clase, y con el aumento de funciones extendidas, las subclases estarán muy infladas.
Cuándo usar: extender una clase sin agregar muchas subclases.
Cómo solucionarlo: Dividir responsabilidades funcionales específicas y heredar el patrón de decorador al mismo tiempo.
Código clave: 1. La clase Component actúa como un rol abstracto y no debe implementarse de manera concreta. 2. La clase modificada hace referencia a la clase Componente y la hereda, y la clase de extensión específica anula el método de la clase principal.
Crear una interfaz:
Forma.java
public interface Shape {
void draw();
}
Paso 2
Cree una clase de entidad que implemente la interfaz.
Rectángulo.java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
círculo.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
Paso 3
Cree una clase de decorador abstracto que implemente la interfaz Shape.
ShapeDecorator.java
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
Paso 4
Cree una clase de decorador de entidades que amplíe la clase ShapeDecorator.
RedShapeDecorator.java
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("Border Color: Red");
}
}
Paso 5
Utilice RedShapeDecorator para decorar el objeto Shape.
DecoratorPatternDemo.java
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
//Shape redCircle = new RedShapeDecorator(new Circle());
//Shape redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}