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 |