Introducción a los patrones de estructuración
Presentación
El objetivo de los patrones de estructuración es facilitar la independencia de la interfaz de un objeto o de un conjunto de objetos respecto de su implementación. En el caso de un conjunto de objetos, se trata también de hacer que esta interfaz sea independiente de la jerarquía de clases y de la composición de los objetos.
Proporcionando interfaces, los patrones de estructuración encapsulan la composición de objetos, aumentan el nivel de abstracción del sistema de forma similar a como los patrones de creación encapsulan la creación de objetos. Los patrones de estructuración ponen de relieve las interfaces.
La encapsulación de la composición no se realiza estructurando el objeto en sí mismo sino transfiriendo esta estructuración a un segundo objeto. Éste queda íntimamente ligado al primero. Esta transferencia de estructuración significa que el primer objeto posee la interfaz de cara a los clientes y administra la relación con el segundo objeto que gestiona la composición y no tiene ninguna interfaz con los clientes externos.
Esta realización ofrece otra mejora que es la flexibilidad en la composición, la cual puede modificarse de manera dinámica. En efecto, es sencillo sustituir un objeto por otro siempre que sea de la misma clase o que respete la misma interfaz. Los patrones Composite, Decorator y Bridge...
Composición estática y dinámica
Tomemos el ejemplo de los aspectos de implementación de una clase. Situémonos en un marco en el que podamos tener varias implementaciones posibles. La solución clásica consiste en diferenciarlas a nivel de las subclases. Es el caso de uso de la herencia de una interfaz en varias clases de implementación, como ilustra el diagrama de clases de la figura 3-1.1.
Esta solución consiste en realizar una composición estática. En efecto, una vez se ha escogido la clase de implementación de un objeto, no es posible cambiarla.
Figura 3-1.1 - Implementación de un objeto mediante herencia
Como se ha explicado en la sección anterior, otra solución consiste en separar el aspecto de implementación en otro objeto tal y como ilustra la figura 3-1.2. Las secciones correspondientes a la implementación se gestionan mediante una instancia de la clase ImplementaciónConcretaA o mediante una instancia de la clase ImplementaciónConcretaB. Esta instancia está referenciada por el atributo implementación. Puede sustituirse fácilmente por otra instancia durante la ejecución. Por ello, se dice que la composición es dinámica.
Figura 3-1.2 - Implementación de un objeto mediante asociación
La solución de la figura 3-1.2 se detalla en el capítulo dedicado al patrón...