Patrón de Diseño: Adapter

ABSTRACT— The adapter design pattern (often referred to as the wrapper pattern or simply a wrapper) translates one interface for a class into a compatible interface. An adapter allows classes to work together that normally could not because of incompatible interfaces, by providing its interface to clients while using the original interface. The adapter translates calls to its interface into calls to the original interface, and the amount of code necessary to do this is typically small. The adapter is also responsible for transforming data into appropriate forms.
There are two types of adapter pattern: Object pattern, in this type of adapter pattern, the adapter contains an instance of the class it wraps. In this situation, the adapter makes calls to the instance of the wrapped object. Class Adapter pattern, this type of adapter uses multiple inheritance to achieve its goal. The adapter is created inheriting from both the interface that is expected and the interface that is pre-existing. It is typical for the expected interface to be created as a pure interface class, especially in languages such as Java that do not support multiple inheritance.
The adapter pattern is useful in situations where an already existing class provides some or all of the services you need but does not use the interface you need. A good real life example is an adapter that converts the interface of a Document Object Model of an XML document into a tree structure that can be displayed.


INTRODUCCION

Los patrones estructurales se encargan de modelar las relaciones entre objetos para formar estructuras más o menos complejas. Esto no es del todo exacto, ya que hay patrones estructurales que se encargan de las relaciones entre clases (mayoritariamente el uso de la herencia), mientras que otros se encargan de los objetos, las instancias de las clases (normalmente composición). Uno de estos patrones a destacar es el patrón adaptador (adapter pattern, GoF), del cual se hablara en el presente documento.

I. PATRÓN DE DISEÑO: ADAPTER

A continuación se encuentra la plantilla del patrón objeto de estudio:

1. Nombre del patrón: Adapter.

2. Clasificación del patrón: Estructural.

3. Intención: Convertir la interfaz de una clase en otra interfaz esperada por los clientes. Permite que clases con interfaces incompatibles puedan comunicarse.

4. También conocido como: Wrapper (envoltorio).

5. Motivación:

En un determinado punto del código se espera una instancia de un determinado interfaz o de una determinada clase. Deseamos utilizar una clase distinta que cumple todos los requisitos del interfaz o de la clase concreta que se espera en el código pero que, sin embargo, por las razones que sean no implementa dicho interfaz.

6. Aplicabilidad:

Este patrón se usa cuando:

oSe quiera utilizar una clase ya existente y su interfaz no se corresponda con la interfaz que se necesita.
oCuando se desea crear una clase reusable que coopera con clases no relacionadas, es decir, las clases no tienen necesariamente interfaces compatibles.
oSe quiera utilizar un componente caja negra (COTS, ejecutable, biblioteca de terceros,…).

 Diseñar un módulo que ofrezca la funcionalidad necesaria para comprimir en formato JAR haciendo uso de la utilidad que proporciona Java.
oSe quiera definir una clase que se pueda utilizar para colaborar con otras clases cuyas interfaces no se conocen a priori.

 Diseñar un visualizador genérico de estructuras compuestas (IComposite).


7. Estructura:

Existen dos tipos de patron adaptador:

ADAPTADOR DE OBJETO

En este tipo de modelo del adaptador, el adaptador contiene una instancia de la clase que envuelve. En esta situación, el adaptador hace las llamadas a la instancia del objeto envuelto. El adaptador extiende la interfaz del target y tiene un objeto del tipo del objeto adaptado (composición). Puede adaptar no solo la clase Adaptee sino cualquier subclase de ella, lo que mejora la flexibilidad.



ADAPTADOR DE CLASE

Este tipo de adaptador se usa herencia múltiple para lograr su objetivo. El adaptador que se crea hereda tanto de la interfaz que se espera y la interfaz que es pre-existente. Es típico de la interfaz de espera que se creará como una mera interfaz de clase, especialmente en idiomas tales como Java que no admiten herencia múltiple. El adaptador implementa la interfaz del Target y extiende la clase adaptada. Puede adaptar solo la clase Adaptee (ninguna de sus subclases). Puede sobreescribir el comportamiento del Adaptee si se necesita.



8. Participantes:
•Target define la interfaz específica del dominio que Client usa.
•Client colabora con la conformación de objetos para la interfaz Target.
•Adaptee define una interfaz existente que necesita adaptarse.
•Adapter adapta la interfaz de Adaptee a la interfaz Target, mediante herencia o delegación.

9. Colaboraciones:
•Los clientes envían sus peticiones a una instancia de Adapter que la reenvía a otra de Adaptee.
•Client llama a las operaciones sobre una instancia Adapter. De hecho, el adaptador llama a las operaciones de Adaptee que llevan a cabo el pedido.

10. Consecuencias:

•Adaptación por herencia

1. Adapta Adaptee a Target encargando a una clase Adaptee concreta. Como consecuencia, una clase adaptadora no funcionará cuando se desea adaptar una clase y todas sus subclases.
2. Permite a los Adapter sobrescribir algo de comportamiento de Adaptee, ya que Adapter es una subclase de Adaptee.
3. No es necesario mantener una referencia.

•Adaptación por delegación o composición

1. Permite que un único Adapter trabaje con muchos Adaptees, es decir, el Adapter por sí mismo y las subclases (si es que la tiene). El Adapter también puede agregar funcionalidad a todos los Adaptees de una sola vez.
2. Hace difícil sobrescribir el comportamiento de Adaptee. Esto requerirá derivar Adaptee y hacer que Adapter se refiera a la subclase en lugar que al Adaptee por sí mismo.
•Otra cuestión a considerar es que este patrón presenta un pequeño inconveniente al darse la imposibilidad de cambiar las clases convenientemente.

11. Implementación:

•¿Cuál suele ser el alcance de la adaptación?

Desde acondicionar un método del objeto Adapter al objeto Adaptee, hasta realizar operaciones antes y después de invocar el método del Adaptee.
•Crear una nueva clase que será el Adaptador, que extienda del componente existente e implemente la interfaz obligatoria. De este modo se tiene la funcionalidad que se quería y se cumple la condición de implementar la interfaz.
•Se debe diferenciar entre los patrones Adapter y Facade, ya que el primero reutiliza una interfaz ya existente, mientras que el segundo define una nueva con el objetivo de simplificarla.
12. Usos Conocidos:

•Un buen ejemplo de la vida real es un adaptador que convierte la interfaz de un Modelo de Objetos de Dominio (DOM) de un XML en un documento de estructura de árbol que se puede mostrar.

•Clases adaptadoras del JDK

1. Para gestionar eventos un objeto debe implementar EvenListener.
2. Para gestionar eventos de objetos de tipo Window debe implementar la interfaz WindowListener que extiende EventListener
3. WindowListener tiene siete métodos, pero en muchas ocasiones no se usan más de tres, ¿es posible evitar la definición de clases derivadas de WindowListener que no añaden comportamiento para la mayoría de los métodos?
4. El JDK proporciona la clase abstracta WindowAdapter para dicho fin.


13. Patrones relacionados:

•Proxy define un representante para un objeto pero no cambia su interfaz.
•Decorator decora un objeto sin modificar su interfaz.

REFERENCIAS
[1] García Pérez Baltasar. Desarrollo rápido de aplicaciones. Version PDF.
[2] Orjuela Luz Marina. Modelos de Programación: Patrones GOF 09. Universidad Distrital Francisco José de Caldas. 2006.
[3] Cuesta Carlos E. Patrones de Diseño. Ingeniería de software I. Universidad Rey Juan Carlos. Versión PDF.
[4] Introducción a los Patrones de Diseño- Adapter. Ingeniería de software II. Universidad de Sevilla. Versión PDF.
[5] Mazzini Daniel. Patrones de Diseño. Versión PDF
[6] http://es.wikipedia.org/wiki/Adapter_(patr%C3%B3n_de_dise%C3%B1o)
[7] http://www.stackframe.net/es/content/10-2008/patrones-de-diseno-adapter-pattern
[8] http://www.programacion.com/java/articulo/joa_patrones4/
[9] http://en.wikipedia.org/wiki/Adapter_pattern

No hay comentarios:

Publicar un comentario