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(); } |
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())); |
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 input = new BufferedReader(new InputStreamReader(System.in)); //System.in is an InputStream object |