ADAPTER |
1. CLASIFICACIÓN DEL PATRÓN
Patrón Estructural.
2. INTENCIÓN
Convierte la interface de una clase en otra interface que el cliente escoja. Adapter deja que las clases trabajen juntas que no podrían hacerlo por interfaces incompatibles.
3. CONOCIDO TAMBIÉN
Wrapper.
4. MOTIVACIÓN
Algunas veces un paquete de herramientas que es diseñado para reusarse no se puede reusar solo porque su interface no concuerda con la de la interface dominante específica que la aplicación requiere.
Considere por ejemplo un diseñador grafico que deja a usuarios dibujar y arreglar los elementos gráficos (líneas, polígonos, texto, etc.) en cuadros y diagramas. En el editor grafico la abstracción dominante es el objeto grafico, que tiene una forma editable y puede dibujarse. La interfaz para los objetos gráficos está definida por una clase abstracta llamada Shape. El editor define una subclase de la forma para cada clase de objeto gráfico:
Una clase de LineShape para las líneas, una clase de PolygonShape para los polígonos, y tan adelante. Las clases para las formas geométricas elementales como LineShape y PolygonShape son algo fáciles de ejecutar, porque su dibujo y capacidades el corregir son intrínsecamente limitadas. Pero una subclase de TextShape que puede exhibir y corregir el texto es considerablemente más difícil ejecutar, puesto que incluso la edición de textos básica implica complicado actualización de la pantalla y gerencia de almacenador intermediario. Mientras tanto, un interfaz utilizador disponible el juego de herramientas pudo proporcionar ya una clase sofisticada de TextView para exhibir y corregir el texto. Idealmente utilizamos el TextView para ejecutar TextShape, pero el Toolkit no fue diseñado con las clases shape en mente. Entonces no podemos usar TextView y Shape alternativamente.
5. POSIBLES APLICACIONES PARA EL ADAPTER
Se debe usar el patrón Adapter cuando:
· Quieres usar una clase existente y su interface no concuerda con la que tú necesitas.
· Quieres crear unas clases reusable que coopera con clases no relacionadas o imprevistas, es decir, clases que no necesariamente tienen interfaces compatibles.
· (adaptador de objetos únicamente) se necesita usar muchas clases existentes, pero no es practico adaptar sus interfaces haciéndole subclases a cada una. Un objeto adapter puede adaptar la interface de sus clases padre.
6. ESTRUCTURA
La estructura básica que maneja el Adapter está compuesta por:
Fig. 1. Diagrama de clases del modelo de uso del Adapter usando herencia multiple
Fig. 2. Diagrama de clases del modelo de uso del Adapter relevando a composicion de objetos.
7. PARTICIPANTES
· Target (objetivo): define la dominante -especifica interface que el cliente utiliza.
· Cliente: colabora con objetos conforme la interface del objetivo.
· Adaptee (adaptado): define una existente interface que necesita ser adaptada.
· Adapter (adaptador): adapta la interface del adaptado a la interface del objetivo.
8. COLABORACIONES
El cliente llama las operaciones en una instancia del adaptador. Después, adapter llama a las operaciones del adaptado que cubren lo que busca el cliente.
9. CONSECUENCIAS
Los adaptadores de clase y de objeto tienen diversas compensaciones. Un adaptador de la clase:
· Adapta al adaptado al objetivo confiando a una clase concreta del adaptador. Por consiguiente, un adaptador no funcionara al intentar adaptar una clase y todas sus subclases.
· Deja el adaptador eliminar algo del comportamiento del adaptado, siempre y cuando el adaptador sea una subclase del adaptado.
· Introduce solamente un objeto, y no hay engaño adicional del indicador necesario conseguir al adaptee.
Un adaptador del objeto
· Deja un solo adaptador trabajar con muchos Adaptados, el Adaptado en sí mismo y todas sus subclases (si las hay). El adaptador puede también agregar funcionalidades a todos los Adaptados inmediatamente.
· Hace más duro eliminar el comportamiento del Adaptado. Requerirá añadir subclases al adaptado y haciendo el adaptador refiera a la subclase más que el Adaptado sí mismo.
7. IMPLEMENTACIÓN
Para la implementación del Adapter es recomendable usar algunas “técnicas” para facilitar su uso.
· Implementando clases adapters en C++: en una implementación de C++ de una clase adapter, adapter puede heredar atributos públicos de la clase target y privados de adaptee, así adapter puede ser un subtipo de Target y no de adaptee.
· Adapters enchufables: miremos tres formas de usar adaptadores enchufables.
· Usando operaciones abstractas. Define las operación es abstractas correspondientes para la interfaces de Adaptee. Subclases deben implementar las operaciones abstractas y adaptar la objeto jerárjico estructurado.
· Usando objetos delegados. En este caso es para accesar a la estructura jerargica para un objeto delegado. Se puede usar una estrategia diferente para adaptar sustituyendo a un delegado diferente.
· Adapters parametrizados: el modo usual para ayudar a los adaptadores enchufados es parametrizar un adaptador con uno o más bloques el constructor del bloque ayuda a la adaptada sin el uso de subclases. Un bloque puede adaptar un pedido, y el adaptador puede guardar el bloque por cada solicitud.
8. CÓDIGO DE EJEMPLO
class Shape {
public:
Shape();
virtual void BoundingBox(
Point& bottomLeft, Point& topRight
) const;
virtual Manipulator* CreateManipulator() const;
};
class TextView {
public:
TextView();
void GetOrigin(Coord& x, Coord& y) const;
void GetExtent(Coord& width, Coord& height) const;
virtual bool IsEmpty() const;
};
class TextShape : public Shape, private TextView {
public:
TextShape();
virtual void BoundingBox(
Point& bottomLeft, Point& topRight
) const;
virtual bool IsEmpty() const;
virtual Manipulator* CreateManipulator() const;
};
void TextShape::BoundingBox (
Point& bottomLeft, Point& topRight
) const {
Coord bottom, left, width, height;
GetOrigin(bottom, left);
GetExtent(width, height);
bottomLeft = Point(bottom, left);
topRight = Point(bottom + height, left + width);
}
class TextShape : public Shape {
public:
TextShape(TextView*);
virtual void BoundingBox(
Point& bottomLeft, Point& topRight
) const;
Virtual bool IsEmpty() const;
virtual Manipulator* CreateManipulator() const;
private:
TextView* _text;
};
9. USOS CONOCIDOS
Se utiliza el patrón adapter para:
· El Algunas clases en NeXT' el delegado del uso de s AppKit [Add94] se opone para realizar la adaptación del interfaz. Un ejemplo es la clase de NXBrowser que puede exhibir listas jerárquicas de datos. NXBrowser utiliza un objeto del delegado para tener acceso y adaptar a los datos.
· La “unión de conveniencia” de Meyer es una forma de adaptador de la clase. Meyer describe a cómo una clase de FixedStack adapta la puesta en práctica de una clase del arsenal el interfaz de una clase del apilado. El resultado es un apilado que contiene un número fijo de entradas.
10. PATRONES ASOCIADOS
Al Adapter comúnmente se le asocia con los patrones bridge, decorator, proxy, y se puede trabajar también con patrones como factory method.
REFERENCIAS BIBLIOGRÁFICAS
Design Patterns. Elements of Reusable Object-Oriented Software - Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides - Addison Wesley (GoF- Gang of Four)
Thinking in patterns in java – Bruce Eckel
Patterns in Java - Mark Grand – Wiley
No hay comentarios:
Publicar un comentario