Patrones de diseño: patrón de decorador

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.

inserte la descripción de la imagen aquí
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();
   }
}

Supongo que te gusta

Origin blog.csdn.net/david2000999/article/details/121613976
Recomendado
Clasificación