1
Patrones estructurales
Cómo clases y objetos se combinan para formar estructuras más complejas.
Patrones basados en herencia
Sólo una forma de Adapter
Patrones basados en composición
Describen formas de combinar objetos para obtener nueva funcionalidad
Posibilidad de cambiar la composición en tiempo de ejecución.
2
Adapter / Wrapper (Adaptador)
Propósito
Convertir la interfaz de una clase en otra que el cliente espera. Permite la colaboración de ciertas clases a pesar de tener interfaces incompatibles
Motivación
Un editor gráfico incluye una jerarquía que modela elementos gráficos (líneas, polígonos, texto,..) y se desea reutilizar una clase existente TextView para implementar la clase que representa elementos de texto, pero que tiene una interfaz incompatible.
3
Adaptador
Motivación
A menudo un toolkit o librería de clases no se puede utilizar debido a que su interfaz es incompatible con la interfaz requerida por la aplicación.
No debemos o podemos cambiar la interfaz de la librería de clases
4
Adaptador
Aplicabilidad
Se desea usar una clase existente y su interfaz no coincide con la que se necesita.
Se desea crear una clase reutilizable que debe colaborar con clases no relacionadas o imprevistas.
5
Problema
¿Cómo resolver interfaces incompatibles o proporcionar una interfaz estable para componentes que ofrecen una misma funcionalidad pero su interfaz es diferente?
En una aplicación TPV soportar diferentes tipos de servicios externos de autorización de pagos.
6
Adaptador
Consecuencias
Un adaptador basado en herencia no funciona cuando queramos adaptar una clase y sus subclases.
Un adaptador basado en herencia puede redefinir comportamiento heredado de Adaptado.
Un adaptador basado en herencia no implica ninguna indirección, sólo introduce un objeto.
Un adaptador basado en composición permite adaptar una clase y sus subclases, pudiendo añadir funcionalidad a todos los adaptados a la vez.
Para un adaptador basado en composición es complicado redefinir comportamiento de Adaptado.
7
Adaptador
Consecuencias
La funcionalidad de Adaptador depende de la similitud entre la interfaz de las clases Objetivo y Adaptado.
Adaptadores “pluggable”:
¿Cómo creamos una clase reutilizable preparada para colaborar con clases cuya interfaz se desconoce?
Ejemplo: Clase TreeDisplay para visualizar estructuras jerárquicas de cualquier naturaleza.
8
Ejemplo en Java 1.3 Swing
La librería Swing de Java incluye clases gráficas que muestran información organizada en cierto formato, como son JTree (información jerárquica), JTable (tabla bidimensional) o JList (lista de datos). Estas clases son clientes respectivamente de TreeModel, TableModel y ListModel que le aíslan de los detalles de un modelo de datos concreto y que incluyen métodos que le permiten obtener los datos a representar según el formato que corresponda.
9
Ejemplo en Java 1.3 Swing
public interface ListModel {
int getSize();
Object getElementAt(int index);
}
public interface TableModel {
public int getRowCount();
// obtener número de filas
public int getColumnCount();
// obtener número de columnas
public Object getValueAt(int fil, int col);
// retorna valor del elemento fila fil y columna col
public String getColumnName(int col);
// retorna nombre de la columna col
}
10
Ejemplo en Java 1.3 Swing
public interface TreeModel {
public Object getRoot();
// retorna nodo raíz
public Object getChild(Object parent, int index);
// retorna nodo hijo del padre en posición index
public int getChildCount(Object parent);
// retorna número de hijos del nodo padre
public boolean isLeaf(Object node);
// retorna true si es un nodo hoja
}
Página siguiente |