Es bueno comenzar con el enfoque "vertical" y migrar al enfoque "horizontal" cuando el número de decoradores comienza a crecer.
Un Decorator es una de las mejores maneras de agregar características a un objeto sin cambiar su interfaz. Yo uso el patrón "composite"muy a menudo y siempre me pregunto cómo diseñar la lista de características configurable. No estoy seguro de tener la respuesta correcta, pero veamos un ejemplo.
Digamos que tengo una lista de los números:
interface Numbers {
Iterable<Integer> iterate();
}
Ahora quiero crear una lista que sólo tendrá números impares, sin repetir, positivos, y ordenados. El primer enfoque es vertical:
Numbers numbers = new Sorted(
new Unique(
new Odds(
new Positive(
new ArrayNumbers(
new Integer[] {
-1, 78, 4, -34, 98, 4,
}
)
)
)
)
);
El segundo enfoque es horizontal:
Numbers numbers = new Modified(
new ArrayNumbers(
new Integer[] {
-1, 78, 4, -34, 98, 4,
}
),
new Diff[] {
new Positive(),
new Odds(),
new Unique(),
new Sorted(),
}
);
¿Ves la diferencia? El primer enfoque decora ArrayNumbers "verticalmente", añadiendo funcionalidad a través de los decoradores componibles Positive, Odds, Unique, and Sorted.
El segundo enfoque presenta la nueva interfaz Diff (diferencias), que implementa la funcionalidad básica de los números iteración a través de instancias de Positive, Odds, Unique, and Sorted.
interface Diff {
Iterable<Integer> apply(Iterable<Integer> origin);
}
Para el usuario de numbers (números), ambos enfoques son los mismos. La diferencia está sólo en el diseño. ¿Cuál es mejor? y ¿Cuándo? Parece que la decoración vertical es más fácil de implementar y es más adecuada para objetos más pequeños que exponen sólo unos pocos métodos.
En cuanto a mi experiencia, siempre tiendo a comenzar con la decoración vertical, ya que es más fácil de implementar pero finalmente migrar a una horizontal cuando el número de decoradores comienza a crecer.
by Yegor Bugayenko Oct 15, 15 · Java Zone
| © 1997 - - La Güeb de Joaquín | |||||
|
Joaquín Medina Serrano
|
|||||
|
| Codificación | |
| Fecha de creación | |
| Última actualización | |
|