Categorías
Design Patterns Stories

Patrón de diseño de Java: Decorador – Decora a tu novia

El patrón de decorador agrega características adicionales a un objeto existente de forma dinámica. En esta publicación, usaré un ejemplo simple, decorar a tu novia, para ilustrar cómo funciona el patrón de decorador.

1. Historia del patrón del decorador

Supongamos que estás buscando novia. Hay chicas de diferentes países como América, China, Japón, Francia, etc. Pueden tener diferentes personalidades y pasatiempos. En una web de citas como eharmony.com, si cada tipo de chica es una clase individual de Java, habría miles de clases. Ese es un problema serio llamado explosión de clase. Además, este diseño no es extensible. Siempre que haya un nuevo tipo de chica, es necesario crear una nueva clase.

Cambiemos el diseño y dejemos que cada afición / personalidad se convierta en un decorador que se puede aplicar dinámicamente a una chica.

2. Diagrama de clases

Girl es la clase abstracta al más alto nivel, tenemos chicas de diferentes países. Con una clase de GirlDecorator, podemos decorar a cada niña con cualquier característica agregando un nuevo decorador.

3. Código Java del patrón del decorador

Girl.java

public abstract class Girl {
	String description = "no particular";
 
	public String getDescription(){
		return description;
	}
}

AmericanGirl.java

public class AmericanGirl extends Girl {
	public AmericanGirl(){
		description = "+American";
	}
}

EuropeanGirl.java

public class EuropeanGirl extends Girl {
	public EuropeanGirl() {
		description = "+European";
	}
}

GirlDecorator.java

public abstract class GirlDecorator extends Girl {
	public abstract String getDescription();
}
  Patrón de diseño de Java: Fachada

Science.java

public class Science extends GirlDecorator {
 
	private Girl girl;
 
	public Science(Girl g) {
		girl = g;
	}
 
	@Override
	public String getDescription() {
		return girl.getDescription() + "+Like Science";
	}
 
	public void caltulateStuff() {
		System.out.println("scientific calculation!");
	}
}

Podemos agregar más métodos como «Dance ()» a cada decorador sin ninguna limitación.

Art.java

public class Art extends GirlDecorator {
 
	private Girl girl;
 
	public Art(Girl g) {
		girl = g;
	}
 
	@Override
	public String getDescription() {
		return girl.getDescription() + "+Like Art";
	}
 
	public void draw() {
		System.out.println("draw pictures!");
	}
}

Main.java

package designpatterns.decorator;
 
public class Main {
 
	public static void main(String[] args) {
		Girl g1 = new AmericanGirl();
		System.out.println(g1.getDescription());
 
		Science g2 = new Science(g1);
		System.out.println(g2.getDescription());
 
		Art g3 = new Art(g2);
		System.out.println(g3.getDescription());
	}
}

Producción:


+ Americano
+ Ciencia + estadounidense
+ Americano + Me gusta la ciencia + Me gusta el arte

También podemos hacer algo como esto:

Girl g = new Science(new Art(new AmericanGirl()));
  Patrón de diseño de Java: compuesto

4. Patrón de decorador utilizado en la biblioteca de soportes de Java

Un uso típico del patrón Decorator son las clases IO de Java.

Aquí hay un ejemplo simple: BufferedReader decora InputStreamReader.

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
//System.in is an InputStream object

InputStreamReader (InputStream en) – puente de flujos de bytes a flujos de caracteres. InputSteamReader lee bytes y los traduce a caracteres utilizando la codificación de caracteres especificada.

BufferedReader (lector en) – leer texto de un flujo de caracteres y caracteres de búfer para proporcionar métodos de lectura eficientes (por ejemplo, readLine ())

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *