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 | |
![]() |